c++ - 条件等待开销

标签 c++ linux multithreading boost pthreads

当使用boost::conditional_variableACE_Conditional 或直接使用pthread_cond_wait 时,等待本身是否有任何开销?这些是更具体的问题:

  1. 等待线程被取消调度后,它会在等待到期之前被调度回来然后再次被取消调度,还是会一直处于未调度状态直到收到信号?
  2. wait 是否定期获取互斥锁?在这种情况下,我猜想每次迭代都会在系统调用上浪费一些 CPU 时间来锁定和释放互斥锁。这与不断获取和释放互斥锁一样吗?
  3. 此外,从发出信号到从 wait 返回需要多长时间?

Afaik,当使用信号量时,获取调用响应取决于调度程序时间片大小。它在 pthread_cond_wait 中是如何工作的?我认为这取决于平台。我对 Linux 更感兴趣,但如果有人知道它在其他平台上的工作原理,也会有所帮助。

还有一个问题:是否为每个条件分配了额外的系统资源?我不会在我的代码中创建 30000 个互斥锁,但我是否应该担心使用同一个互斥锁的 30000 个条件?

最佳答案

这是 pthread_cond 手册页中的内容:

pthread_cond_wait atomically unlocks the mutex and waits for the condition variable cond to be signaled. The thread execution is suspended and does not consume any CPU time until the condition variable is signaled.

因此,从这里开始,我将回答以下问题:

  1. 在发出等待信号或取消等待之前,不会调度等待线程。
  2. 没有周期性的互斥量获取。在等待返回之前,互斥体只会被重新获取一次。
  3. 信号和等待返回之间耗时与由于互斥量释放导致的线程调度的时间相似。

关于资源,在同一手册页上:

In the LinuxThreads implementation, no resources are associated with condition variables, thus pthread_cond_destroy actually does nothing except checking that the condition has no waiting threads.

更新:我深入研究了 pthread_cond_* 函数的来源,行为如下:

  1. Linux 中的所有 pthread 条件都是使用 futex 实现的.
  2. 当一个线程调用wait 时,它被挂起并且未被调度。线程 ID 插入等待线程列表的尾部。
  3. 当线程调用signal 时,列表头部的线程被调度回来。 因此,唤醒与调度程序一样高效,不消耗操作系统资源,唯一的内存开销是等待列表的大小(参见 futex_wake 函数)。

关于c++ - 条件等待开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3960650/

相关文章:

c - 使用 2 个线程 ID 的合并排序

java - 邮件被防火墙阻止

python - wxPython 网格函数在第一次传递到 wx.CallAfter 之后突然停止“可调用”

java - 线程信号序列

c++ - 使用 c++ builder 5 编译 sqlite 数据库时出错

c++ - 为什么对原始类型的操作是无序的而不是不确定的顺序?

c++ - 当不再有对象引用时,COM 会自动卸载 DLL 吗?

linux - BASH 语法检查 Debug模式故障?

c++ - std::condition_variable::wait_for 和 std::condition_variable::wait_until 有什么区别?

c++ - 为什么 Visual Studio 会在这里调用析构函数,而 GCC 不会?