【问题标题】:Am I supposed to unlock mutexes in a cleanup handler?我应该在清理处理程序中解锁互斥锁吗?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-23
      • 2020-07-03
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      相关资源
      最近更新 更多