Pthreads 我应该在清理处理程序中解锁互斥锁吗?

Pthreads 我应该在清理处理程序中解锁互斥锁吗?,pthreads,signals,mutex,cancellation,resource-cleanup,Pthreads,Signals,Mutex,Cancellation,Resource Cleanup,手册中的几句话 引用man3pthread\u mutex\u unlock: 没有一个互斥函数是取消点,甚至不是pthread_mutex_lock,尽管它可以将线程挂起任意时间。这样,取消点的互斥体的状态是可预测的,允许取消处理程序在线程停止执行之前精确地解锁那些需要解锁的互斥体 但后来有一段写道: 互斥函数不是异步信号安全的。这意味着不应从信号处理程序调用它们。特别是,从信号处理程序调用pthread_mutex_lock或pthread_mutex_unlock可能会使调用线程死锁 好的

手册中的几句话

引用
man3pthread\u mutex\u unlock

没有一个互斥函数是取消点,甚至不是pthread_mutex_lock,尽管它可以将线程挂起任意时间。这样,取消点的互斥体的状态是可预测的,允许取消处理程序在线程停止执行之前精确地解锁那些需要解锁的互斥体

但后来有一段写道:

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

好的,所以手册命令我在清理处理程序中解锁互斥体,但禁止我在信号处理程序中解锁互斥体。好吧,引用
man3pthread\u cancel

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

啊。因此,通过接收信号来取消线程

这难道不意味着取消清理处理程序实际上就是一个信号处理程序吗?或者更确切地说,我不知道,清理处理程序是从一个信号处理程序调用的,该信号处理程序的默认操作是调用由
pthread\u cleanup\u push安装的函数?不能否认在接收信号时调用了这些清理处理程序

但这会使手册与它自己的陈述相矛盾


如何正确理解问题?

在Linux上使用信号处理取消是一个实现细节。这并不意味着只允许在它们中使用异步信号安全函数

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