pthread_cond_wait()的解锁和等待的原子性?

时间:2018-01-06 22:33:18

标签: c multithreading pthreads

pthread_cond_wait()来电的解锁和等待是多么原子? 是否有一个窗口,其中互斥锁已经解锁,但该线程尚未处于实际等待并能够接收通知的部分? IOW,pthread_cond_wait()函数本身是否有可能错过唤醒?

1 个答案:

答案 0 :(得分:5)

POSIX.1-2008 specification of pthread_cond_wait在第二段中解决了这个问题:

  

这些函数[pthread_cond_waitpthread_cond_timedwait]原子地释放互斥锁并导致调用线程阻塞条件变量 cond ;原子地这里的意思是“相对于另一个线程访问互斥锁然后条件变量的原子性”。也就是说,如果另一个线程能够在即将发布的线程之后获取互斥锁,那么对该线程中的pthread_cond_broadcast()pthread_cond_signal()的后续调用应该就像它被发布一样在即将到来的线程被阻止之后。

所以,首先,答案是“是的,它是原子的”,但要注意最后一句话。只要对pthread_cond_broadcastpthread_cond_signal的调用来自在休眠线程释放后成功获取互斥锁的线程 ,就没有错过唤醒窗口,然后,或许,再次发布它。如果调用来自一个自发布以来至少没有获取过互斥锁的线程,则唤醒可能会丢失。