在cond_var.notify()之前是否需要使用互斥锁?

时间:2019-01-16 21:32:07

标签: c++ multithreading

更新:
在我看来,我的问题不是重复的。我强调的是细微差别-我们不需要传输数据。实际上,我的问题是三个不同的问题。

我有几个问题。
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)也许您知道一种更轻巧的方式来通知(无论是否发送消息,这都不重要)另一个线程?

0 个答案:

没有答案