更新:
在我看来,我的问题不是重复的。我强调的是细微差别-我们不需要传输数据。实际上,我的问题是三个不同的问题。
我有几个问题。
1)std::condition_variable
到处都被认为是同步访问数据的一种手段。因此,用法示例通常如下所示:
void put (const T &val) {
std::unique_lock<std::mutex> lock(m_Mtx);
m_Value = val;
m_CondVar.notify_one();
}
T get () {
std::unique_lock<std::mutex> lock(m_Mtx);
m_CondVar.wait(lock);
return m_Value;
}
很明显。但是,如果我不需要传输数据,而只需要唤醒等待线程(如果有的话)怎么办?在这种情况下,我可以不使用互斥体并使用这样的代码吗?
void put_nolock () {
m_CondVar.notify_one();
}
从文档中还不清楚。在pthread_cond_signal
的文档中可以看到:
pthread_cond_broadcast()或pthread_cond_signal()函数可能是 线程是否当前拥有它的互斥体调用 调用pthread_cond_wait()或pthread_cond_timedwait()的线程有 在等待期间与条件变量关联;但是,如果 需要有可预测的调度行为,则该互斥锁应为 被调用pthread_cond_broadcast()的线程锁定或 pthread_cond_signal()。
我不知道-这到底是什么意思(“但是,如果 需要可预测的调度行为...“)? 我的目标是进行微优化,减少互斥量,减少潜在的上下文切换。那么也许根本没有意义,使用互斥锁+ cond_var的成本等于仅使用cond_var的成本?
2)m_CondVar.notify_one()
的费用是多少?会是常规的系统调用吗?是否取决于是否有等待线程或cond_var?
3)也许您知道一种更轻巧的方式来通知(无论是否发送消息,这都不重要)另一个线程?