【问题标题】:pthread_cond_wait unlocks mutex attached with it. source code?pthread_cond_wait 解锁附加的互斥锁。源代码?
【发布时间】:2013-05-15 10:04:44
【问题描述】:

我知道 pthread_cond_wait 会解锁附带的互斥锁。我想定位的是 pthread_cond_wait 的源代码,并定位解锁互斥代码。如果问题很愚蠢,请裸露。 :)。我必须下载和检查哪个库。我正在使用 Ubuntu。

【问题讨论】:

    标签: c linux pthreads


    【解决方案1】:

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

    【讨论】:

    • 需要注意的是,这个实现有许多严重的未解决的错误,其中很多都与:sourceware.org/bugzilla/show_bug.cgi?id=13165
    • @R.. 哇,谢谢你的链接。很不幸,这些都是错误的 condvar 实现的明显迹象。
    • 是的。这一切似乎都源于他们正在执行的一些黑魔法,以试图解释唤醒的数量,显然是为了消除所有虚假的唤醒。但是,我已经针对 NPTL condvar 实现和我自己的不使用任何此类黑客的实现运行错误报告中的测试用例,并且无法获得任何虚假唤醒,所以我的结论是到目前为止,他们为防止虚假唤醒所做的努力是不必要的,而且(由于错误)只是有害的......
    • 尽量减少虚假唤醒是好的。然而,正确性是必不可少的。
    【解决方案2】:

    另一种选择是 OpenSolaris source;如果您对 linux(即 glibc)感兴趣,那么@David Schwartz 的回答可能会更“准确”。

    【讨论】:

      【解决方案3】:

      虽然这不是您问题的确切答案,但互斥锁解锁发生方式的重要方面是它必须在 条件变量结构更新以反映服务员在当下。这就是标准所说的函数“原子地”解锁互斥锁并等待时的含义。否则,将存在相同的竞争条件,就好像您在调用 pthread_cond_wait 之前自己解锁了互斥锁一样:另一个线程可以获取互斥锁并在您检查谓词之后修改谓词所依赖的状态(发现它为假)但之前你打电话给pthread_cond_wait。然后你会错过信号并继续等待 cond var,也许永远。

      【讨论】:

        猜你喜欢
        • 2010-11-22
        • 2013-02-02
        • 2011-09-12
        • 2018-05-23
        • 1970-01-01
        • 1970-01-01
        • 2022-07-31
        • 2021-12-23
        相关资源
        最近更新 更多