为什么仿生C中的pthread_cond_wait不是原子的?

时间:2012-05-14 15:06:09

标签: android multithreading posix libc bionic

实施中存在竞争条件,可能导致错过信号。问题是pthread_cond_wait函数不是原子的吗?同样在文件中的注释中讨论 https://github.com/android/platform_bionic/blob/master/libc/bionic/pthread.c

此操作不应该是原子操作吗?

1 个答案:

答案 0 :(得分:1)

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

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

如果您想要阅读的内容比您想要了解的更详细,请阅读this paper