我會先介紹一些代碼,因爲解釋更容易。假設互斥正確使用條件變量來保持它的簡單:條件變量 - 等待/通知競爭條件
// Thread 1
while(1)
{
conditionVariable.wait();
// Do some work
}
// Thread 2
while(1)
{
// Do some work
conditionVariable.notify_one();
}
// Thread 3
while(1)
{
// Do some work
conditionVariable.notify_one();
}
我想實現的是,線程1是保證在條件變量上等待時,線程2或3螺紋通知。如代碼所示,notify_one()
和wait()
之間有很大的差距,以其他代碼的形式標註評論。這個差距意味着有時notify_one()
被調用之前有機會致電wait()
。
經過一番思考,似乎最接近我的是在notify_one()
之前和wait()
之前(在線程1的循環開始之前)使用某種形式的互斥。但是,無論如何完成,互斥和wait()
之間仍然存在一小段差距(1行代碼),允許線程2和3在線程1調用wait()
之前調用notify_one()
。這是不可能的,但可能的。
我也考慮過使用wait()
謂詞來標記一個允許其他線程通知的布爾值。我猜這會起作用,因爲wait()
是原子,但我想知道是否有更好的方法。也許我錯誤地接近了這一點。
總結:如何確保線程1在允許線程2和3通知之前等待?