2017-11-22 11 views
0

私はここに受け入れ答えを参照してください。私は、これはイベントクラスとしてどのように機能するかを理解していない理解のstd :: condition_variable

struct gate { 
    bool gate_open = false; 
    mutable std::condition_variable cv; 
    mutable std::mutex m; 

    void open_gate() { 
    std::unique_lock<std::mutex> lock(m); 
    gate_open=true; 
    cv.notify_all(); 
    } 
    void wait_at_gate() const { 
    std::unique_lock<std::mutex> lock(m); 
    cv.wait(lock, [this]{ return gate_open; }); 
    } 
}; 

Using std::conditional_variable to wait on a condition特にコード(コピー)します。何かが既にwait_at_gate関数を介して待機している場合、どのくらい正確にmutex内のコードがopen_gateで実行されますか?私はそれがstd::condition_variableと関係があると推測しています。コメントや下記のリンクによって助け

+2

条件変数は取得されたロックを解除し、シグナルが送られるのを待つので、 'open_gate'が進むことがあります。 –

+0

OKだから、cvがロックを解除すると、他のスレッドがgate_openを設定してからnotify_allを呼び出すまでブロックされたままです。次に、これはcv.waitハンドラを呼び出します。これがtrueの場合は、cv.waitのブ​​ロックを解除します。これはすべて正しいですか? –

+2

@PasserByと同じことを言っていますが、もう少し詳しく説明します: 'cv.wait(lock、...)'コールはmutexを_unlocks_すると通知されるのを待ってから、前にmutexを再ロックしますそれが返されます。 –

答えて

0

OK、誰が投稿しようとしていないので、ここで私の答えだ、(テキストを引用し、そこからは、読みやすくするためにどの若干の修正、からである):

http://en.cppreference.com/w/cpp/thread/condition_variablehttp://en.cppreference.com/w/cpp/thread/condition_variable/waithttp://en.cppreference.com/w/cpp/thread/condition_variable/notify_all

OGという名前の2つのスレッドを想定し、open_gate()を呼び出す一方、WGを呼び出してwait_at_gate()を呼び出します。

1)どちらの関数もロックで保護されているため、「std::condition_variableで待機しようとするスレッド」は、「」を共有変数の保護に使用したのと同じmutexで取得する必要があります。

2)OGが最初にロックを取得すると、ロックを解除する前にゲートが開きます。 WGはロックを取得し、ゲートは既に開かれています。この場合(リンクされた参照から):

while (!pred()) { 
    wait(lock); 
} 

この場合、待機はありません。

3)WGが最初にロックを取得した場合、cv.waitを呼び出すと、「mutexがアトミックに解放され、スレッドの実行が一時停止されます。

4)これにより、OGが進行し、共有フラグが設定されます。 「notify_all()が実行されたときにWG」がブロック解除される」OG

関連する問題