2012-12-28 39 views
2

如果你有一个线程(线程1)阻挡在sem_wait()和另一个线程(线程2)破坏是非常旗语,使用sem_destroy(),那么会发生什么线程1?sem_destroy一个信号量别人拥有一个sem_wait吗?

A quick search on the internet tells me that it produces undefined behavior:

销毁信号量,目前被阻塞在其他的进程或线程(以sem_wait(3))将产生不确定的行为。

但是,我碰巧看到这被用在许多多线程C++应用程序中。

我的主要问题:

  • 莫不是在此的任何目的是什么?
  • 他们试图达到什么目的(例如,这会隐式终止线程)?
  • 这不应该是非常不安全的吗?
+5

'它只是恰巧,我一直在读在这里,有许多最近的多线程C++应用程序来学习一些好的编码实践,我已经看到了这一点做多times'这是极其非不足为奇。即使您看到它在Linux内核中完成,也不要依赖未定义的行为。 – Falmarri

回答

3

我不能想到任何API中的单个案例我听说过,在使用中间的东西时,销毁某些东西是理智的或定义的。所以在我看来你的问题的答案是:

那么他们试图实现什么?

我不知道。

不应该说是非常不安全的?

是的!

也许你看着那些其他程序的作者都知道什么样的实现实际上做的,是依靠它。但他们必须为未来可能发生变化做好准备。也许他们已经权衡了这样一种变化的风险,他们通过采取捷径并依赖未定义的行为并且认为它值得。你必须为自己做出判断。

相关问题