Sem_destroy一个被其他人持有sem_wait的信号量

sem_destroy a semaphore someone else holds a sem_wait on?

本文关键字:sem 信号量 其他人 wait 一个 destroy Sem      更新时间:2023-10-16

如果一个线程(thread1)阻塞了sem_wait(),而另一个线程(thread2)使用sem_destroy()销毁了这个信号量,那么thread1会发生什么?

在网上快速搜索了一下,告诉我它会产生未定义的行为:

销毁当前其他进程或线程阻塞的信号量(in sem_wait(3))会产生未定义的行为。

但是,我碰巧看到在许多多线程c++应用程序中使用了这个。

我的主要问题:

  • 这有什么意义吗?
  • 他们试图实现什么(例如,这会隐式终止线程)?
  • 那不是很不安全吗?

在我听说过的任何API中,我都想不出在使用过程中销毁某个东西是合理的或定义的。所以在我看来,你的问题的答案是:

那么他们想要达到什么目的呢?

我不知道。

那不是很不安全吗?

是的!

也许你看过的那些其他程序的作者知道它们的实现实际上是做什么的,并且依赖于它们。但他们必须为未来可能发生的变化做好准备。也许他们已经权衡了这种改变打破计划的风险,以及走捷径和依赖未定义行为所获得的节省,并认为这是值得的。你必须自己做出判断。

这取决于实现。有些将解锁被信号量阻塞的进程,并将errno设置为EINVAL。有些则不会。我在Linux上做了一些实验。结果不一致。有时另一个进程会无限期地阻塞。有时它将被解锁,但没有设置errno。