Уведомление происходит до пробуждения ожидания?

Это программа

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 на условной переменной, в этом случае никогда не будет пробуждения). Итак, я бы предположил, что (с любым порядком памяти) нет необходимости раскомментировать строку с защитным устройством.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]