首页 > 解决方案 > 为什么 pthread_mutex_lock 没有被标记为异步信号安全?

问题描述

你看,sem_post被标记为异步信号安全。但是为什么pthread_mutex_lock没有标记为异步信号安全,而下面的程序让你错觉它实际上是异步信号安全的?

void handle(int arg){
    printf("I wake up!\n");
}
int main()
{
    signal(SIGHUP, handle);
    pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
    pthread_mutex_lock(&lock);
    printf("gonna be blocked\n");

    pthread_mutex_lock(&lock);
    pthread_mutex_unlock(&lock);
    return 0;
}

kill -hup $pid会让它打印出一些东西。但是仍然没有获得锁并且程序被阻塞(我的意思是,它没有完成),这给我的印象是它是异步信号安全的。

您可以查阅 Advanced unix 编程环境书籍,或man sigaction获取异步信号安全功能列表。

标签: linuxunixpthreadssignalsposix

解决方案


但是为什么 pthread_mutex_lock 没有被标记为异步信号安全

因为它不是。

而下面的程序让你错觉它实际上是异步信号安全的?

您的程序与异步信号安全无关。您从这个测试程序得出的任何关于异步信号安全的结论都是完全错误的。

异步信号安全是关于能够异步信号处理程序调用函数。

要查看这pthread_mutex_lock不是异步信号安全的,请编写一个具有 3 个线程的程序:一个在紧密循环中执行pthread_mutex_lock,一个在来自信号处理程序pthread_mutex_unlock的同一个互斥体上执行相同操作,第三个将无休止的s 流发送到过程。SIGHUP

如果pthread_mutex_lock异步信号安全,该程序将永远运行。

但我希望你会观察到这个程序会在一段时间后崩溃或死锁。

即使它没有,那仍然不意味着它pthread_mutex_lock是安全的,只是你还没有证明它是不安全的。


推荐阅读