我会先介绍一些代码,因为解释更容易。假设互斥正确使用条件变量来保持它的简单:条件变量 - 等待/通知竞争条件
// 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通知之前等待?