Это программа
std::condition_variable cond_var;
std::mutex mtx;
std::atomic<int> value {0};
const auto mem_ord = std::memory_order_seq_cst;
std::thread notify_thread([&]
{
{
//std::unique_lock<std::mutex> lock (mtx);
value.store (1, mem_ord);
}
cond_var.notify ();
});
{
std::unique_lock<std::mutex> lock (mtx);
cond_var.wait (lock, [&] { return value.load (mem_ord) != 0; });
}
notify_thread.join ();
гарантированно прекратить или может тупик? Что если бы кто-то использовал mem_ord = std::memory_order_relaxed
? Могут ли быть какие-либо другие причины удерживать замок, пока store
в atomic<int>
? cppreference.com требует, чтобы кто-то раскомментировал линию с помощью защитного устройства в notify_thread
,
Я ожидаю, что (с любым порядком памяти) store
случается, перед тем уведомление, которое случается, перед тем (потенциальное) пробуждение в wait
, который случается, перед тем load
, (Я говорю «потенциальное пробуждение», потому что notify-thread
может, конечно, закончить до wait
на условной переменной, в этом случае никогда не будет пробуждения). Итак, я бы предположил, что (с любым порядком памяти) нет необходимости раскомментировать строку с защитным устройством.
Задача ещё не решена.
Других решений пока нет …