条件等待开销

Fir*_*his 4 c++ linux multithreading boost pthreads

使用或直接使用时boost::conditional_variable,是否存在等待的开销?这些是更具体的问题:ACE_Conditionalpthread_cond_wait

  1. 在等待线程未经调度之后,是否会在等待到期之前将其安排回来,然后再次进行计划,否则它将保持未计划直到发出信号?
  2. 是否wait定期获取互斥锁?在这种情况下,我猜想每次迭代浪费系统调用的一些CPU时间来锁定和释放互斥锁.它是否与不断获取和释放互斥锁相同?
  3. 那么,信号和返回之间经过了多长时间wait

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

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

Fir*_*his 6

这是pthread_cond手册页中的内容:

pthread_cond_wait原子地解锁互斥锁并等待条件变量cond发出信号.线程执行被挂起,并且发出条件变量信号之前不消耗任何CPU时间.

所以从这里我回答以下问题:

  1. 在等待发出信号或取消等待之前,不会安排等待线程.
  2. 没有定期互斥收购.在等待返回之前仅重新获取一次互斥锁.
  3. 由于互斥释放,在信号和等待返回之间传递的时间类似于线程调度的时间.

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

在LinuxThreads实现中,没有资源与条件变量相关联,因此pthread_cond_destroy除了检查条件没有等待线程之外什么都不做.

更新:我挖掘了pthread_cond_*函数的来源,行为如下:

  1. Linux中的所有pthread条件都是使用futex实现的.
  2. 当一个线程调用wait它时,它被暂停和未调度.线程id插入等待线程列表的尾部.
  3. 当一个线程调用signal列表头部的线程时会被调度回来.因此,唤醒与调度程序一样高效,不消耗OS资源,唯一的内存开销是等待列表的大小(请参阅futex_wake函数).