さまざまなスレッドが要素を取得するためのリストがあります。リストが空のときに保護しているmutexをロックしないようにするために、ロックするempty()
前にチェックします。
呼び出しがlist::empty()
100%正しくない場合でも問題ありません。同時list::push()
およびlist::pop()
コールのクラッシュまたは中断を回避したいだけです。
私はVC ++とGnu GCCが時々empty()
間違って、何も悪いことはないと思い込んでも大丈夫ですか?
if(list.empty() == false){ // unprotected by mutex, okay if incorrect sometimes
mutex.lock();
if(list.empty() == false){ // check again while locked to be certain
element = list.back();
list.pop_back();
}
mutex.unlock();
}
std::list::size
一定の時間の複雑さを保証していることを付け加えます。これは、基本的に、サイズ(ノード数)を別の変数に格納する必要があることを意味します。それを呼ぼうsize_
。std::list::empty
次にsize_ == 0
、何かがとして返される可能性が高く、の同時読み取りと書き込みsize_
によりデータ競合が発生するため、UBになります。