【发布时间】:2016-05-25 02:43:02
【问题描述】:
手册中的几句话。
引用man 3 pthread_mutex_unlock:
没有一个互斥函数是取消点,甚至 pthread_mutex_lock 都不是,尽管它可以将线程挂起任意时间。这样,取消点的互斥锁状态是可预测的,允许取消处理程序在线程停止执行之前准确解锁那些需要解锁的互斥锁。
但在一段后面写道:
互斥函数不是异步信号安全的。这意味着不应从信号处理程序调用它们。特别是,从信号处理程序调用 pthread_mutex_lock 或 pthread_mutex_unlock 可能会使调用线程死锁。
好的,所以手册命令我在清理处理程序中解锁互斥锁,但禁止我在信号处理程序中解锁互斥锁。好吧,引用man 3 pthread_cancel:
在 Linux 上,取消是使用信号实现的。
啊。所以线程通过接收信号被取消。
这不会使取消清除处理程序实际上成为信号处理程序吗?或者更确切地说,我不知道,清理处理程序是从一个信号处理程序调用的,其默认操作是调用pthread_cleanup_push 安装的函数?不可否认,这些清理处理程序是在接收到信号时被调用的。
但这会使手册与它自己的陈述相矛盾……
如何正确理解事物?
【问题讨论】:
标签: pthreads signals mutex cancellation resource-cleanup