条件变量和解锁误解

时间:2016-03-15 00:06:28

标签: c multithreading

我注意到在大多数条件变量的例子中,我看到类似的东西:

pthread_cond_signal(&cond, &lock);
pthread_mutex_unlock(&lock);

我的问题是为什么按此顺序完成。为什么在锁定释放之前首先播放信号?如果在信号广播和解锁之间发生上下文切换,则其他线程从睡眠状态唤醒并将尝试访问有问题的锁定,看到它仍然被锁定,然后返回待机状态,因此不会发出信号被浪费了?

为什么这不是更好的解决方案:

pthread_mutex_unlock(&lock);
pthread_cond_signal(&cond, &lock);

在这种情况下,锁定在被唤醒的线程被唤醒之前被释放,因此它们实际上能够访问先前锁定的数据。

有人可以为我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

手册页有答案(强调我的):

  

线程可以调用pthread_cond_broadcast()或pthread_cond_signal()函数,无论它当前是否拥有调用pthread_cond_wait()或pthread_cond_timedwait()的线程在等待期间与条件变量相关联的互斥锁;但是,如果需要可预测的调度行为,则该互斥锁应由调用pthread_cond_broadcast()或pthread_cond_signal()的线程锁定。

答案 1 :(得分:0)

我相信你可能会有所作为。

这不是确定性的,因为它来自C ++的std::condition_variable,但我相信它使用了引擎盖下的pthread_*次调用:http://en.cppreference.com/w/cpp/thread/condition_variable

由此,在示例部分中,我们有:

// Manual unlocking is done before notifying, to avoid waking up
// the waiting thread only to block again (see notify_one for details)
lk.unlock();
cv.notify_one();