非同期操作が完了するまでプログラム フローをブロックできるメカニズムを実装したいと考えています。(ほとんどの場合、メッセージ ループがない単体テストで使用されます。)
私が持っているコードはスレッドを作成し、スレッド内で条件通知を待ちます:
#include <chrono>
#include <condition_variable>
#include <iostream>
#include <memory>
#include <mutex>
#include <stdexcept>
#include <thread>
struct Blocker {
Blocker() :
wait_thread([this]() {
std::mutex mtx;
std::unique_lock<std::mutex> lck(mtx);
cond.wait(lck);
})
{
}
void wait() { wait_thread.join(); }
void notify() { cond.notify_one(); }
std::condition_variable cond;
std::thread wait_thread;
};
template<typename Callback>
void async_operation(const Callback & cb) { cb(); }
int main() {
Blocker b;
async_operation([&](){ b.notify(); });
b.wait();
}
notify
問題は、スレッドが開始される前にへの呼び出しが発生するため、デッドロックが頻繁に発生することです。これを修正するにはどうすればよいですか?