Есть ли способ дождаться разблокировки мьютекса (или аналогичного объекта), не блокируя его после этого?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Есть ли способ дождаться разблокировки мьютекса (или аналогичного объекта), не блокируя его после этого?

Сообщение Anonymous »

Другими словами, есть ли способ получить «обратную» переменную условия, которая будет блокировать ожидающий поток до тех пор, пока блокирующий поток не снимет блокировку, но не блокировать ожидающий поток, если блокирующий поток не заблокирован?
У меня есть основной поток и дочерний поток, которые оба работают с одним и тем же фрагментом данных. По большей части я использую std::barrier, чтобы синхронизировать эти два потока и гарантировать, что один поток не читает данные, пока другой записывает. Однако есть одно место, где дочерний поток запускает цикл std::for_each(std::execution::par_unseq), который считывает данные и выполняет некоторые тяжелые вычисления, в то время как основной поток выключен и выполняет свои собственные действия. вещь, не касающаяся данных, за исключением одного места, где они могут или не могут записывать некоторые данные.
Я хотел бы иметь возможность приостанавливать все чтения в потоках, когда основной поток запись, но я не хочу, чтобы каждое чтение в потоках блокировало любое другое чтение, если запись не происходит.
Я не знаю, сколько потоков for_each мог отделиться, поэтому я не могу использовать здесь барьер, да и не хочу, поскольку не хочу ждать, если чтение не произойдет. Это несложно сделать с циклом занятости, но мне сказали, что использование цикла занятости в многопоточном коде является плохим тоном, и что эти ожидания std приостанавливают потоки и отправляют сигналы на уровне ОС.

Подробнее здесь: https://stackoverflow.com/questions/788 ... ut-locking
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»