2016-02-14 108 views
1

一些手册中的引用。我是否应该在清理处理程序中解锁互斥锁?

报价man 3 pthread_mutex_unlock

的互斥功能都不是取消点,甚至没有的pthread_mutex_lock,尽管事实,即它可以暂停任意时长的线。这样,取消点处的互斥状态是可预测的,允许取消处理程序正确解锁那些需要在线程停止执行前解锁的互斥锁。

但是一个段落后,它被写:

互斥锁函数不是异步信号安全。这意味着它们不应该从信号处理程序中调用。特别是,从信号处理程序中调用pthread_mutex_lock或pthread_mutex_unlock可能会导致调用线程死锁。

好的,所以手动命令我在清理处理程序中解锁互斥体,但禁止我解锁信号处理程序中的互斥体。那么引用man 3 pthread_cancel

在Linux上,使用信号实现取消。

啊。所以一个线程被接收信号取消。

这不会使取消清除处理程序实际上是一个信号处理程序吗?或者更确切地说,我不知道,清理处理程序是从一个信号处理程序调用的,它的默认行为是调用由pthread_cleanup_push安装的函数?人们不能否认在收到信号时调用这些清理处理程序。

但是,这将使手动顶撞它自己的语句......

如何理解的事情是否正确?

回答

1

该消除是在Linux上使用的信号处理的事实是一个实现细节。这并不意味着您只能在其中使用异步信号安全功能。

至少对于取消点的延迟取消,POSIX不会限制可以调用的函数,因此实现必须使其工作。