手册中的几个引用。
引用man 3 pthread_mutex_unlock
:
互斥函数都不是取消点,甚至pthread_mutex_lock都没有,尽管它可以挂起一个任意持续时间的线程。这样,取消点处的互斥锁状态是可预测的,允许取消处理程序精确解锁在线程停止执行之前需要解锁的互斥锁。
但后来有一段写道:
互斥锁功能不是异步信号安全的。这意味着不应该从信号处理程序调用它们。特别是,从信号处理程序调用pthread_mutex_lock或pthread_mutex_unlock可能会使调用线程死锁。
好的,所以手册命令我在清理处理程序中解锁互斥锁,但禁止我在信号处理程序中解锁互斥锁。好吧,引用man 3 pthread_cancel
:
在Linux上,使用信号实现取消。
阿。因此,通过接收信号取消线程。
这不会使取消清理处理程序实际上成为信号处理程序吗?或者更确切地说,我不知道,清理处理程序是从信号处理程序调用的,其默认操作是调用pthread_cleanup_push
安装的函数?人们不能否认在收到信号时会调用这些清理处理程序。
但这会使手册与自己的陈述相矛盾......
如何正确理解事物?
答案 0 :(得分:1)
在Linux上使用信号处理取消的事实是一个实现细节。它并不意味着您只能在其中使用异步信号安全功能。
至少对于取消点的延迟取消,POSIX并不限制可以调用的函数,因此实现必须使其工作。