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

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

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

15 ответов

35 просмотров

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта