私はここに受け入れ答えを参照してください。私は、これはイベントクラスとしてどのように機能するかを理解していない理解の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
と関係があると推測しています。コメントや下記のリンクによって助け
条件変数は取得されたロックを解除し、シグナルが送られるのを待つので、 'open_gate'が進むことがあります。 –
OKだから、cvがロックを解除すると、他のスレッドがgate_openを設定してからnotify_allを呼び出すまでブロックされたままです。次に、これはcv.waitハンドラを呼び出します。これがtrueの場合は、cv.waitのブロックを解除します。これはすべて正しいですか? –
@PasserByと同じことを言っていますが、もう少し詳しく説明します: 'cv.wait(lock、...)'コールはmutexを_unlocks_すると通知されるのを待ってから、前にmutexを再ロックしますそれが返されます。 –