1

この番組か

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に-ing している間、ロックを保持する他の理由はありatomic<int>ますか? cppreference.comは、 のロックガードのある行のコメントを外す必要があることを要求していnotify_threadます。

(任意のメモリ順序で)通知store の前に発生し、 の(潜在的な)ウェイクアップの前に発生しwait前に発生することを期待しますloadnotify-thread(もちろん、条件変数の前に終了する可能性があるため、「潜在的なウェイクアップ」と言いwaitます。その場合、ウェイクアップはありません)。したがって、(メモリの順序に関係なく)ロックガードのある行のコメントを外す必要はないと思います。

4

0 に答える 0