【发布时间】:2014-01-23 09:39:46
【问题描述】:
我将首先展示一些代码,因为这样解释起来更容易。假设互斥锁与条件变量正确使用以保持简单:
// 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() 之间存在很大差距,以 cmets 标记的一些其他代码的形式存在。这个差距意味着有时 notify_one() 在有机会调用 wait() 之前被调用。
经过一番思考,我似乎最接近这一点的是在 notify_one() 和 wait() 之前(在线程 1 的循环开始时)使用某种形式的互斥。但是,无论怎么做,互斥和wait() 之间仍然有一个小的差距(1 行代码),允许线程 2 和 3 在线程 1 调用 wait() 之前调用notify_one()。这不太可能,但可能。
我还考虑过使用wait() 谓词来标记一个允许其他线程通知的布尔值。我想这会起作用,因为wait() 是原子的,但我想知道是否有更好的方法。也许我处理的不正确。
总结:如何确保线程 1 在允许线程 2 和 3 通知之前正在等待?
【问题讨论】:
标签: c++ multithreading thread-safety race-condition condition-variable