假设所讨论的计算机上有未使用的执行资源,即并未使用所有CPU。如果线程正在等待条件变量,那么唤醒此线程的成本是多少?同样,等待条件变量的成本是多少?我对粗略量化和成本来源感兴趣。如果答案是“它取决于”,我主要关心的是x86 / x64上最新版本的Windows和Linux。
编辑:由于涉及内核调用,内核调用比常规函数调用贵多少?
答案 0 :(得分:2)
我不知道有关pthreads或D实现的任何细节,但总的来说,条件变量的最佳情况开销是一个额外的内核调用和可能的上下文切换。
典型的实现只是事件和互斥体的包装,因此开销和时序可以通过这些内核对象的行为来表征。在等待线程时,线程会放弃其预定时间量程的剩余时间,并在唤醒线程时由内核调度并根据其优先级获取下一个可用时间量。这在很大程度上取决于负载和内核配置,但通常只需几毫秒。
对于条件变量,然后还有重新获取互斥锁的附加任务,当然这可能会阻塞。如果它没有阻塞,那么它仍然是内核调用。这可能最终被优化到几个原子CPU指令,相比之下它们非常快,但仅限于单个进程。 [编辑:Win32中的CRITICAL_SECTION或Linux中的futex。]
最糟糕的情况是条件变量是虚假触发的,线程唤醒只是为了发现无事可做,但这通常占总开销的一小部分。
答案 1 :(得分:0)
这与您的问题有关,但我认为这不是您正在寻找的答案。
我们对信号与互斥/条件进行基准测试,以了解哪种方法可以睡眠并更快地唤醒线程。对于信号,我们使用sigwait()暂停和pthread_kill唤醒。对于互斥/条件我们为每个线程使用了一个互斥锁和一个条件。我们发现我们可以使用信号睡眠和唤醒线程快5倍。
我们没有测试futexes。
答案 2 :(得分:0)
回答你的最后一个问题:
由于涉及内核调用,内核调用比常规函数调用贵多少?
是的,大约要贵1000倍。