Skip to content

Instantly share code, notes, and snippets.

@umegaya
Created February 14, 2018 05:45
Show Gist options
  • Save umegaya/ddf362856c7eb2bdc87a9dcfe99bb692 to your computer and use it in GitHub Desktop.
Save umegaya/ddf362856c7eb2bdc87a9dcfe99bb692 to your computer and use it in GitHub Desktop.
condition_variable
cv.wait***から抜けたあと、この関数に渡していたunique_lockはlockされているが、これはwakeupと不可分に起きるわけではない。
例えば他のスレッドが対応するmutexをロックするようなコードを実行していると、以下のようなフローが発生しうる
cv.notifyXXX 呼び出し => cv.waitXXX が再開 => __cv.waitXXXに渡されていたlockを他のスレッドが取得 => cv.waitXXXの中で、再開されたスレッドがlockを取得
したがって以下のようなコードでXが完了するまでYが実行されないことを保証することはできない
{
unique_lock lock(mutex);
cv.wait(lock, predicate);
//X
}
{
cv.notify_all();
unique_lock lock(mutex);
//Y
}
cv.wait(lock, predicate)は while(!predicate()) { cv.wait(lock); } であることに注意。つまり、cv.waitに入る前にpredicateが満たされていた場合、
実際のcv.waitは行われない。
つまり他のスレッドはmutex lockした上でpredの状態を変更させ、cv.notify_allすれば実際にこのcvを待つスレッドがcv.waitの中に入っていたかどうか関係なく
cv.waitに正常に入り、抜けることができる
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment