条件变量的成本是多少?

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

要回复问题请先登录注册