Sem_destroy一个被其他人持有sem_wait的信号量
sem_destroy a semaphore someone else holds a sem_wait on?
如果一个线程(thread1)阻塞了sem_wait()
,而另一个线程(thread2)使用sem_destroy()
销毁了这个信号量,那么thread1会发生什么?
在网上快速搜索了一下,告诉我它会产生未定义的行为:
销毁当前其他进程或线程阻塞的信号量(in sem_wait(3))会产生未定义的行为。
但是,我碰巧看到在许多多线程c++应用程序中使用了这个。
我的主要问题:
- 这有什么意义吗?
- 他们试图实现什么(例如,这会隐式终止线程)? 那不是很不安全吗?
在我听说过的任何API中,我都想不出在使用过程中销毁某个东西是合理的或定义的。所以在我看来,你的问题的答案是:
那么他们想要达到什么目的呢?
我不知道。
那不是很不安全吗?
是的!
也许你看过的那些其他程序的作者知道它们的实现实际上是做什么的,并且依赖于它们。但他们必须为未来可能发生的变化做好准备。也许他们已经权衡了这种改变打破计划的风险,以及走捷径和依赖未定义行为所获得的节省,并认为这是值得的。你必须自己做出判断。
这取决于实现。有些将解锁被信号量阻塞的进程,并将errno设置为EINVAL。有些则不会。我在Linux上做了一些实验。结果不一致。有时另一个进程会无限期地阻塞。有时它将被解锁,但没有设置errno。
相关文章:
- 删除旧的信号量系统V
- 父进程和子进程之间的 POSIX 信号量
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 多线程.如果我使用信号量,我可以在开始时创建很多线程还是应该只有几个线程?
- C/C++ - 用于按顺序打印数字的 sem_t 类型的单个信号量
- 单车道桥 使用信号量进行同步
- 用于 64 位/32 位 IPC 的 POSIX 信号量的替代方案?
- 这个餐饮哲学家问题(dpp)的解决方案是如何工作的?互斥体和信号量
- 发布信号量返回错误 6(无效句柄)
- 在 C Linux 中使用三个线程使用信号量同步按顺序打印 3 4 5 50 次
- 在使用 pthread 和信号量实现生产者-消费者问题时需要帮助
- 如何让一个线程继续,而另一个线程正在等待C++中的信号量
- 实现信号量
- 计算信号量还是互斥体?
- POSIX 信号量在高争用/负载下不起作用
- C++:提升:托管共享内存是否需要信号量锁
- 信号量的问题
- 如何使用Windows API直接将进程"assign"到信号量?
- 从主线程C++更新信号量
- 生产者 - 消费者生产商创建2个元素POSIX信号量