![](/img/trans.png)
[英]C++ Macs OS X semaphore.h: trouble with `sem_open()` and `sem_wait()`
[英]sem_destroy a semaphore someone else holds a sem_wait on?
如果您有一个线程(thread1)阻塞在sem_wait()
,另一个线程(thread2)使用sem_destroy()
销毁该信号量,那么 thread1 会发生什么?
销毁其他进程或线程当前被阻塞的信号量(在 sem_wait(3) 中)会产生未定义的行为。
但是,我碰巧在许多多线程 C++ 应用程序中看到了它。
我的主要问题:
在我听说过的任何 API 中,我想不出一个案例,其中在使用过程中销毁某些东西是理智的或已定义的。 所以在我看来,你的问题的答案是:
那么他们想要达到什么目的呢?
我不知道。
那不是很不安全吗?
是的!
也许你看过的那些其他程序的作者知道这些实现实际上做了什么并且依赖于它。 但他们必须为未来可能发生的变化做好准备。 也许他们已经权衡了这种改变破坏他们的计划的风险和他们通过走捷径和依赖未定义行为所实现的节省,并认为这是值得的。 你必须自己做出判断。
这取决于实现。 有些人会通过信号量解锁进程阻塞并将 errno 设置为 EINVAL。 有些不会。 我在 Linux 上做了一些实验。 结果不一致。 有时另一个进程会无限期地阻塞。 有时它会被解锁但没有设置 errno。 我猜在 Linux 上这确实是一种未定义的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.