2012-02-02 49 views

回答

3

pthread_cond_*函数和pthread_mutex_*函数是NPTL的一部分,它现在是任何现代Linux机器上的glibc的一部分。最新版本是glibc-2.11.1,您可以在GNU glibc download site上找到源代码。

+1

应该指出的是,这个实现有一些严重的未解决的错误,其中很多连接到:http://sourceware.org/bugzilla/show_bug.cgi?id=13165 – 2012-02-02 17:16:21

+0

@R ..哇,谢谢为链接。这是非常不幸的,这些都是不正确的condvar实施的明确迹象。 – 2012-02-02 19:37:35

+0

是的。这一切似乎都源于他们正在试图解释清醒次数的一些黑魔法,显然是为了消除所有虚假清醒。然而,我已经从bug报告中运行了测试用例,同时针对NPTL condvar实现和我自己的实现,它们不使用任何这样的黑客,也没有能够得到任何虚假的wakes,所以我的结论如此远远是他们防止虚假唤醒的努力是不必要的,并且(由于错误)简直是有害的... – 2012-02-03 00:42:27

2

另一种选择是OpenSolaris source;如果你对linux感兴趣,也就是glibc,@David Schwartz的答案可能更“准确”。

0

虽然这不完全是您的问题的答案,但互斥锁解锁发生的重要方面是必须在之后执行条件变量结构更新以反映服务员存在。这是标准的意思,当它说功能“原子”解锁互斥和等待。否则,就会出现相同的竞争条件,就像在调用pthread_cond_wait之前自己解锁互斥体一样:另一个线程可以获取互斥体,并在检查谓词(并且发现它为假)之后修改谓词依赖的状态,但在调用之前pthread_cond_wait。然后,你会错过信号,并继续等待cond var,或许永远。