170 похожих чатов

Когда я делаю std::recursive_mutex::lock(), а он допустим уже заблокирован, у

меня поток стоит ждёт когда разблокируется?

15 ответов

30 просмотров

рекурсив мутех реализуется через знание или знание об id треда заблокировавшего или thread_local (но это кринж)

Зависит от того, какой поток делает lock(). Если тот же, что сейчас "владеет" мьютексом, то lock() ждать не будет. Если другой - поведёт себя как обычный мьютекс - будет ждать. Рекурсивный мьютекс нужен для того, чтобы можно было рекурсивно (из одного же потока) его блокировать без дедлока

Дмитрий-Воронин Автор вопроса
Alexander Karaev
Зависит от того, какой поток делает lock(). Если т...

А тоесть если из разных потоков, то всё таки будет ждать пока не разблокируется

Дмитрий Воронин
А тоесть если из разных потоков, то всё таки будет...

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

Denis P
интересный был бы мьютекс, который можно захватыва...

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

Андрей Руссков
ну если сделать на транзитивной памяти то ок. Захв...

транзитивная память это всё красивая теория, мы же про реальные системы вроде говорим

не хочу душнить и лезть с советом, который не просили, но использовать recursive_mutex практически всегда является нерекомендуемой практикой: Most of the time, if you think you want a recursive mutex, you probably need to change your design instead. A common use of recursive mutexes is where a class is designed to be accessible from multiple threads concurrently, so it has a mutex pro- tecting the member data. Each public member function locks the mutex, does the work, and then unlocks the mutex. But sometimes it’s desirable for one public mem- ber function to call another as part of its operation. In this case, the second member function will also try to lock the mutex, leading to undefined behavior. The quick-and- dirty solution is to change the mutex to a recursive mutex. This will allow the mutex lock in the second member function to succeed and the function to proceed. But such usage is not recommended because it can lead to sloppy thinking and bad design. In particular, the class invariants are typically broken while the lock is held, which means that the second member function needs to work even when called with the invariants broken. It’s usually better to extract a new private member function that’s called from both member functions, which does not lock the mutex (it expects it to already be locked). You can then think carefully about the circum- stances under which that new function can be called and the state of the data under those circumstances.

Если очень хочется, то используй shared_mutex

Denis P
транзитивная память это всё красивая теория, мы же...

Вроде сейчас современные процессоры поддерживают ее в целом

Yalokin Kononov
Вроде сейчас современные процессоры поддерживают е...

если речь о HTM то интель дропнул поддержку, а больше она нигде и не работала

Rustam
если речь о HTM то интель дропнул поддержку, а бол...

ARM TME, емнип, существует и даже где-то в современных процессорах (начиная с ARMv9-A, вроде) работает

Похожие вопросы

Обсуждают сегодня

Мужики и девушки, привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных...
Kraszx
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Я вот подумал. SSE выполняет операции максимум с 64-битной точностью. А FPU - всегда с 80-битной. Разве не должно быть FPU точнее тогда?
The Bird of Hermes
13
как быть с принтером? такой подход прокатит?
zamtmn
12
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Я не понимаю, это троллинг или что? Швабрика поддерживают, который буквально пишет на ассемблере взаимодействия с винапи. Я это ещё написал загрузчик и хоть что-то изучаю в о...
Shadow Akira
6
А вот это что за конструкция? Вернее, она тут нафига?
Serjone
10
Привет. Подскажите, как правильно сматчить лист фиксированного размера, чтобы компилятор не говорил мне о неполном паттерне? Допустим что-то такое [x', y'] = sort [x, y]?
Arseny
8
Карта сайта