2009-09-30 27 views
12

ManualResetEventに相当するブーストがあるのでしょうか?基本的に、私はクロスプラットフォームの実装をしたいと思います...または、誰かがBoost :: threadを使用してManualResetEventの機能を模倣するのを助けることができますか?ありがとう人ManualResetEventに相当するBoost?

+0

どのイベント関数をエミュレートしますか? – curiousguy

答えて

12

mutexと条件変数がある場合、手動リセットイベントを作成するのはかなり簡単です。

リセットイベントが通知されたかどうかを示すフィールドが必要です。フィールドへのアクセスは、ミューテックスによって保護される必要があります。これには、イベントの設定/リセットと、それが通知されているかどうかの確認の両方が含まれます。

あなたのイベントを待っているときに、それが現在通知されていない場合は、シグナルが通知されるまで条件変数を待つことをお勧めします。最後に、イベントを設定するコードで、イベントを待っている人を目覚めるために条件変数に通知する必要があります。

class manual_reset_event 
{ 
public: 
    manual_reset_event(bool signaled = false) 
     : signaled_(signaled) 
    { 
    } 

    void set() 
    { 
     { 
      boost::lock_guard<boost::mutex> lock(m_); 
      signaled_ = true; 
     } 

     // Notify all because until the event is manually 
     // reset, all waiters should be able to see event signalling 
     cv_.notify_all(); 
    } 

    void unset() 
    { 
     boost::lock_guard<boost::mutex> lock(m_); 
     signaled_ = false; 
    } 


    void wait() 
    { 
     boost::lock_guard<boost::mutex> lock(m_); 
     while (!signaled_) 
     { 
      cv_.wait(lock); 
     } 
    } 

private: 
    boost::mutex m_; 
    boost::condition_variable cv_; 
    bool signaled_; 
}; 
+1

私はあなたが 'boost :: condition_variable_any'を使ってこれを動作させる必要があるかもしれないと思います。参照:http://stackoverflow.com/questions/8758353/whats-the-difference-between-stdcondition-variable-and-stdcondition-variable – Nick

+0

また、condition_variable_any :: waitメソッドにはパラメータとしてmutexを指定する必要がありますが、ロックガードではありません。 – Oliver

+0

うーん、私が取得: エラーC2664 'のボイドブースト:: condition_variable ::待つ(後押し:: unique_lockの&)': '後押し:: lock_guard ' を 'に後押し:: unique_lockの&' からパラメータ1を変換することはできませんが私はcondition_variable_anyを使用していますが、unlock()メソッドに関するcondition_variableの中に別のエラーがあります。 – Alexander

1

IIRC、ManualResetEvent複数のスレッドがオブジェクトを待機できるようにするために存在し、オブジェクトが通知されたときに1つのスレッドが同時に呼び起こされるようにします。 「手動リセット」の部分は、スレッドが復帰した後にシステムが自動的にイベントをリセットしないという事実に由来します。あなたはそれを代わりに行います。

これはcondition variablesに非常に類似して聞こえる:

一般的な使用パターンは、あるスレッドがミューテックスをロックした後condition_variable又はcondition_variable_anyのインスタンスにwaitを呼び出すことです。待ち状態からスレッドが呼び出されると、適切な条件が真であるかどうかを調べ、そうであれば処理を続行します。条件が真でない場合、スレッドは再びwaitを呼び出して待機を再開します。

+0

私は基本的に、ライターが書き込みをしていないときに読むことができるリーダースレッドを持っている間、常に書き込みをしなければならない書き込みスレッドを持っています。ありがとう – Polaris878

+0

私はあなたのデザインが理にかなっていると言います。 –