1

非同期操作が完了するまでプログラム フローをブロックできるメカニズムを実装したいと考えています。(ほとんどの場合、メッセージ ループがない単体テストで使用されます。)

私が持っているコードはスレッドを作成し、スレッド内で条件通知を待ちます:

#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問題は、スレッドが開始される前にへの呼び出しが発生するため、デッドロックが頻繁に発生することです。これを修正するにはどうすればよいですか?

4

1 に答える 1

2
#include <mutex>
#include <condition_variable>

struct blocker
{
  blocker () : done (false) {}

  void
  notify ()
  {
    std::unique_lock<std::mutex> lock (m);
    done = true;
    c.notify_all (); 
  }

  void
  wait ()
  {
    std::unique_lock<std::mutex> lock (m);
    while (!done)
      c.wait (lock);
  }

  bool done;
  std::mutex m;
  std::condition_variable c;
};
于 2012-12-08T15:31:03.900 に答える