Created
February 14, 2018 05:45
-
-
Save umegaya/ddf362856c7eb2bdc87a9dcfe99bb692 to your computer and use it in GitHub Desktop.
condition_variable
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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