4

C#ではとても便利AutoResetEvent ManualResetEventWaitHandle.WaitAll。同じ機能を使用するには、C ++で何を使用する必要がありますか(ブーストを使用できます)?WindowsとLinuxで実行できるように、移植可能なコードが必要です。

4

1 に答える 1

1

リンクを完全には読んでいません。futures/promisesを使用して実装できると思います。

promiseは、イベント値、値を待機する将来を設定するために使用されます。

自動/手動リセットを取得するには、スマートポインターを使用した追加の間接参照が必要になり、promise/futureが再割り当てされます。

次に、アイデアに従います。

template <typename T>
class AutoResetEvent 
{
  struct Impl {
    promise<T> p;
    future<T> f;
    Impl(): p(), f(p) {}
  };
  scoped_ptr<Impl> ptr;
public:
  AutoResetEvent() : ptr(new Impl()) {}
  set_value(T const v) {
    ptr->p.set_value(v);
  }
  T get() {
     T res = ptr->f.get();
     ptr.reset(new Impl());
  }
  void wait() {
     ptr->f.wait();
     ptr.reset(new Impl());
  }
};

それらを移動可能にするには、もう少し必要になります。

いくつかの先物を待つことは、あなたが待ちたいイベントのコンテナを繰り返すことから成ります。

于 2012-12-11T17:16:57.443 に答える