Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
3 / 3 / 0
Регистрация: 15.08.2014
Сообщений: 480

Хитрый мьютекс

30.04.2025, 23:37. Показов 3526. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!
Есть ли в C++ мьютекс или другой механизм блокировки (т.е. пара lock/unlock, далее по тексту просто- мьютекс), которая работала бы не совсем стандартно, а именно:

1 - lock - если мьютекс не захвачен, то захват (стандартно),
2 - lock - если мьютекс захвачен другим потоком, то ожидание (стандартно),
3 - lock - если мьютекс захвачен тем же потоком, что и пытающий его захватить, то игнорирует lock.
- unlock - аналогично (в варианте 3 - ничего не делает).

Поясню зачем это нужно: в библиотеке имеется несколько процедур разного уровня A, B, C, вызываются они сверху вниз.
Например:
A вызывает B, B вызывает С и т.п.

Пользовательская программа в одном и том же потоке может вызывать A, или B или C. Процедуры могут работать с общим ресурсом, необходимо блокировать доступ к нему.

Однако, если блокировку сделать на уровне A (высоком) , то блокировки в B или C зависнут (если вызов идет по схеме A -> B -> C).

Блокировки с уровней B, C убрать нельзя - пользовательская программа тогда не сможет их безопасно вызвать.

Если все блокировки вынести на самый нижний уровень C, то проблем с deadlock не будет, но блокировки будут делаться часто - хотелось бы этого избежать.

Можно передавать по цепочке флажок - сделана ли блокировка на более высоком уровне, тогда более низкий уровень будет знать, что ему блокировать не надо (заморочно их тащить).

Поэтому и хотелось бы узнать о наличии механизма, который позволил бы вызывать блокировки в A, B, C когда потребуется, однако чтобы lock/unlock не блокировал/разблокировал, если блокировка ранее сделана в том же потоке...

(если, конечно, такой механизм имеется...)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.04.2025, 23:37
Ответы с готовыми решениями:

Мьютекс - ошибка 'Unresolved external'
Здравствуйте. Не работает программа, подскажите пожалуста что не так. #include <vcl.h> #pragma...

Мьютекс, не могу понять, сигналирован или нет
Разработать программу, состоящую из двух потоков, работающих с общими данными, первый поток вводит...

Мьютекс в чем ошибка
Пытаюсь разобраться с мьютексом. Первым делом пытаюсь определить копия запущена приложения или нет....

5
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
30.04.2025, 23:49
Лучший ответ Сообщение было отмечено LUN2 как решение

Решение

LUN2, не совсем как вы описывали, но в вашей ситуации поможет: https://en.cppreference.com/w/... sive_mutex.
1
3 / 3 / 0
Регистрация: 15.08.2014
Сообщений: 480
01.05.2025, 00:22  [ТС]
DrOffset, спасибо!
Судя по описанию - похоже на то, о чем я говорил.
Попробую использовать.
Еще попробовал поискал аналогичные инструменты, но не мьютекс, а критическую секцию, но аналог (рекурсивная) не нашел, по крайней мере, с ходу...
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
01.05.2025, 06:34
Цитата Сообщение от LUN2 Посмотреть сообщение
но не мьютекс, а критическую секцию
Это как это? "Мьютекс" и "критическая секция" - это абсолютно одно и то же. "Критическая секция" - лишь вариация терминологии в некоторых частных реализациях, с возможно сопутствующими деталями реализации.

Цитата Сообщение от LUN2 Посмотреть сообщение
но аналог (рекурсивная) не нашел, по крайней мере, с ходу...
Поэтому возникает вопрос: где вы ее искали? "Критические секции", навскидку, есть в WinAPI, но там они являются рекурсивными прямо сразу.
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6090 / 2781 / 1037
Регистрация: 01.06.2021
Сообщений: 10,142
01.05.2025, 12:55
LUN2,

Не по теме:

Цитата Сообщение от LUN2 Посмотреть сообщение
которая работала бы не совсем стандартно, а именно
начиналась как проблема XY
Цитата Сообщение от LUN2 Посмотреть сообщение
Поясню зачем это нужно
но дальше здравый смысл восторжествовал. Браво!

0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,865
03.05.2025, 02:01
А мне вот такое вот понравилось. Я учил (пытался вьехать).
Не то?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <process.h>
#include <iostream>
//----------------
HANDLE e;
 
unsigned int __stdcall potoc(void* p) {
    char *pint = (char*)p;
    std::cout << pint << std::endl;
    Sleep(1000);
    SetEvent(e);// Устанавливает указанный объект события в сигнальное состояние.(Разрешает проход через пробку)
    //  -------- ResetEvent(e);  // Запрещает проход через пробку.
    //  --------  CloseHandle(e); //Хендл надо бы закрыть
    return 0;
}
 
//----------------  http://www.firststeps.ru/mfc/winapi/r.php?119
//------------- https://eax.me/winapi-threads/
// --------------------- https://ru.st-ack-ov-erflo-w.com/questions/674933/
// ---------------- https://rsdn.org/article/cpp/cxx_events.xml
 
 
 
int main()
{
    const char * mas = "12345";
 
    e = CreateEventA(NULL, FALSE, FALSE, NULL);
 
    _beginthreadex(NULL, 0, &potoc, (void*)mas, 0, NULL);// Создает поток
 
    WaitForSingleObject(e, INFINITE);// Эта ху пробка. Она ждёт разрешения из потока -- SetEvent(e);
    //                INFINITE - ждёт вечно
    /*
Если WaitForSingleObject(e, INFINITE); использовать несколько раз в цикле потока,
                      то он после одного прохождения, лочит (SetEvent(e);)   снова
            ( Если второй параметр CreateEventA TRUE, функция создает объект события ручного сброса,
        который требует использования функции сброса ResetEvent) --- не лочит ---
    
Ожидание, пока указанный объект не окажется в сигнальном состоянии
или пока не истечет интервал времени ожидания (INFINITE - бесконечно).
Если указано ненулевое значение, функция ожидает,
пока объект не будет сигнализирован или интервал не истечет.
    */
    system("pause");
    return 0;
}
Мне перед снятием данных, желательно остановить карусель.
Да оно и так, и эдак работает. Просто для чистоты эксперимента.

Добавлено через 9 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Поток для рисования рамки
        //HANDLE    h_Recv = CreateThread(NULL, 0, frame_stream, (void*)&_param, CREATE_SUSPENDED, NULL);
        //SetThreadPriority(h_Recv, THREAD_PRIORITY_NORMAL);
//ResumeThread(h_Recv);// Запуск потока
        event = CreateEventA(NULL, TRUE,// < -- Ручной сброс
            FALSE, NULL);
        _beginthreadex(NULL, 0, &frame_stream, NULL, 0, NULL);// Создает поток
        
        scr_wind.right = Win_x; scr_wind.bottom = Win_y;//   При запуске программы старая рамка
 
//  =============================
        while(!control::next_step) {    
        //  ======================================================================   ЦИКЛ ОПРОСА КЛАВИШЬ  ==== << ПЕРВЫЙ >>
        //  Функция suspendThread не предназначена для синхронизации потоков,
        //      так как она не контролирует точку в коде, при котором выполнение потока приостановлено.
    //SuspendThread(    h_Recv );   
        //_param.fix_windows = true;// Клавиша <SHIFT> нажата (Останавливает поток для снятия показаний)
            ResetEvent(event);
        Sleep(10);
    // ========= Здесь снимаються показания с рамки в потоке
        Win_x = (short)scr_wind.right;// Должно быть чётное и делиться на четыре
            //--------------------------------      
        Win_y = (short)scr_wind.bottom;
    //ResumeThread(h_Recv);// Запуск потока
        // _param.fix_windows = false;
    SetEvent(event);

Слова умные за одно пишу. Откроешь, почитаешь, вспомнишь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.05.2025, 02:01
Помогаю со студенческими работами здесь

потоки, мьютекс
Доброй ночи!:) У меня есть класс А - это общий ресурс которым пользуются два потока В и С. где...

C++11,mingw 4.7.2 Мьютекс не тип из std
'mutex' in namespace 'std' does not name a type так-же ругается и на thread но асинхронность...

Потоки, мьютекс и семафор
Вот задание: Выполнить индивидуальное задание параллельным алгоритмом (обязательно использовать для...

Межпроцессорный мьютекс linux
Вопрос. В Windows при создании мьютекса CreateMutexA(NULL,false,&quot;NameOfMyMytex&quot;) - создаётся...

Как работают объекты синхронизации (критическая секция, мьютекс, событие, семафор)?
Помогите пожалуйста разобраться!Как должны работать объекты синхронизации такие как:критическая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru