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

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

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

15 ответов

10 просмотров

рекурсив мутех реализуется через знание или знание об 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 то интель дропнул поддержку, а больше она нигде и не работала

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

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

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

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

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
Вопрос по WIN32: Насколько я понимаю то все функции win32 привязаны к объектам операционной системы. Например консоль, файл, кисть, окна итд. Следовательно функции win32 упра...
Tommy Vercetti
6
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
кто-то пользуется компонентами rx ? как их лучше ставить, через OPM? (lazarus)
Iluha Companets
15
Hello, can I install macOS and run flutter on a virtual machine? Is it possible to print for iphone?
Mazones
11
Дороу! У кого-нибудь есть в загашнике проверенная функция экранирования, аналог re.escape в Python? Из доки: » Escape all the characters in pattern except ASCII letters and n...
Daniil Smolyakov
9
В смысле более затратная? Общая стоимость владения лошадью меньше, чем автомобиля. В среднем.
Sergej R
10
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Скажите, тут нет проблемы? IMyInterface1 = interface function GetInterface2: IInterface2; ... function TMyInterface.GetInterface2: IInterface2; begin Result := TI...
Ruslan aka DUDE
18
Карта сайта