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

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

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

15 ответов

33 просмотра

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта