Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pthread_cond_wait()'的原子性;让我们解锁并等待?_C_Multithreading_Pthreads - Fatal编程技术网

pthread_cond_wait()'的原子性;让我们解锁并等待?

pthread_cond_wait()'的原子性;让我们解锁并等待?,c,multithreading,pthreads,C,Multithreading,Pthreads,pthread\u cond\u wait()调用的解锁和等待的原子性如何? 是否存在一个窗口,其中互斥锁已解锁,但线程尚未处于实际等待并能够接收通知的部分? 请注意,pthread\u cond\u wait()函数本身是否存在未唤醒的可能性?在第二段中解决了这个问题: 这些函数[pthread\u cond\u wait和pthread\u cond\u timedwait]自动释放互斥锁,并导致调用线程在条件变量cond上阻塞;原子性在这里意味着“原子性地涉及到另一个线程对互斥体的访问,然

pthread\u cond\u wait()
调用的解锁和等待的原子性如何?
是否存在一个窗口,其中互斥锁已解锁,但线程尚未处于实际等待并能够接收通知的部分?
请注意,
pthread\u cond\u wait()
函数本身是否存在未唤醒的可能性?

在第二段中解决了这个问题:

这些函数[
pthread\u cond\u wait
pthread\u cond\u timedwait
]自动释放互斥锁,并导致调用线程在条件变量cond上阻塞;原子性在这里意味着“原子性地涉及到另一个线程对互斥体的访问,然后是对条件变量的访问”。也就是说,如果另一个线程能够在即将阻止的线程释放互斥对象后获取互斥对象,那么对该线程中的
pthread\u cond\u broadcast()
pthread\u cond\u signal()
的后续调用应表现为它是在即将阻止的线程被阻止后发出的


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

在警告的情况下,与其说唤醒是“丢失”的,不如说它只是没有按照等待顺序排列,因此可能发生在“之前”。@R,在任何其他线程等待之前发生的信号丢失。这就是为什么等待的线程必须总是有一些明确的线程安全的方法来测试它等待的条件的原因。也就是说,服务员应该锁定互斥锁,执行显式测试,然后在测试失败时只调用pthread_cond_wait()。值得记住的是,最后讨论的无序通知不应该引起关注。如果通知线程没有获得锁,那么它一定没有更改依赖数据。因为它上次是在互斥下检查的。问“原子性如何”是没有意义的。一个操作要么是原子性的,要么不是原子性的。没有灰色的阴影。如果有一个窗口,其中
wait()。对你来说幸运的是,。。。(见下面zwol的回答。)