代码之家  ›  专栏  ›  技术社区  ›  FireAphis david.pfx

条件等待开销

  •  4
  • FireAphis david.pfx  · 技术社区  · 14 年前

    使用时 boost::conditional_variable ACE_Conditional 或者直接 pthread_cond_wait ,等待本身有开销吗?以下是更具体的问题:

    1. 等待线程取消计划后,它会在等待到期之前被重新计划,然后再次取消计划,还是在发出信号之前一直保持取消计划?
    2. wait
    3. 另外,信号和返回信号之间经过的时间 ?

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

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

    2 回复  |  直到 14 年前
        1
  •  6
  •   FireAphis david.pfx    14 年前

    下面是在pthread第二个手册页中编写的内容:

    pthread_cond_wait cond 发出信号。线程执行被挂起,并且 不占用任何CPU时间

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

    1. 等待线程在发出信号或取消等待之前不会被调度回。
    2. 在信号和等待返回之间经过的时间与由于互斥释放而导致的线程调度的时间相似。

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

    在LinuxThreads实现中, 没有资源与条件变量关联 pthread_cond_destroy 实际上除了检查条件没有等待线程之外什么也不做。

    更新: 我深入研究了pthread条件函数的源代码,其行为如下:

    1. Linux中的所有pthread条件都是使用 futex .
    2. 当线程调用 wait 它是暂停和不定期的。线程id插入到等待线程列表的末尾。
    3. 当线程调用 signal 列表开头的线程被重新调度。 因此,唤醒和调度程序一样高效,不消耗任何操作系统资源,唯一的内存开销是等待列表的大小(参见 futex_wake 功能)。
        2
  •  1
  •   Potatoswatter    14 年前

    pthread_cond_wait 如果变量已经处于“错误”状态。因为它总是等待,所以总是有与使当前线程进入睡眠和切换相关的开销。

    当线程未计划时,它是未计划的。它不应该使用任何资源,但一个操作系统在理论上可能实现得很糟糕。它可以在发出信号之前重新获取互斥锁,甚至返回(这就是为什么您必须仔细检查条件),但是操作系统将被实现,因此这不会对性能产生太大影响,如果它真的发生的话。它不是自发发生的,而是对另一个可能不相关的信号的反应。

    30000个互斥应该不是问题,但是有些操作系统可能有30000个休眠线程的问题。