【问题标题】:why pthread_cond_wait in bionic C is not atomic?为什么仿生C中的pthread_cond_wait不是原子的?
【发布时间】:2012-05-14 15:06:08
【问题描述】:

在实现中存在可能导致信号丢失的竞争条件。问题是 pthread_cond_wait 函数不是原子的?文件中的注释中讨论了相同的内容 https://github.com/android/platform_bionic/blob/master/libc/bionic/pthread.c

这个操作不应该是原子的吗?

【问题讨论】:

  • 您指的是该文件中的哪条评论?我看不出有什么明显的错误……
  • 请参阅github.com/android/platform_bionic/blob/master/libc/bionic/… 第 1385 行评论说“/* XXX 技术上 存在可能允许 * XXX 错过信号的竞争条件。如果线程 A 是_wait() * XXX 在解锁互斥锁后等待之前抢占,如果其他 * XXX 线程调用信号或广播 UINT_MAX/2 次(准确), * XXX 之前线程 A 再次调度并调用 futex_wait(), * XXX 则信号会丢失。*/"
  • 感谢您的澄清。

标签: android multithreading posix libc bionic


【解决方案1】:

您应该担心这种“竞争条件”。根据评论,只有当一个线程在一个病态的地方入睡,在那里长时间保持睡眠状态,而其他线程向条件变量发出病态的次数(不多也不少)时,才会发生这种情况。

这实际上是许多完全合理的条件变量低级实现所固有的,尤其是在基于futexes 时。基本上,在用户空间代码原子地检查整数变量的值之后,它调用内核执行阻塞操作,但如果整数变量的值在此期间发生变化,它会指示内核中止操作。病态的情况是整数变量在其范围内一直环绕精确整数次(而第一个调用者一直处于阻塞状态!)。

如果您想了解更多关于此类真正微妙细节的信息,请阅读this paper

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-29
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多