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

Why pthread_mutex_lock is not marked as async-signal safe?

你看,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 会打印出一些东西。但是仍然没有获取到锁,程序被阻塞(我的意思是,它没有完成),给我的感觉是异步信号安全。

您可以参考《高级unix编程环境》一书,或者man sigaction获取async-signal安全函数列表。

But why pthread_mutex_lock is not marked as async-signal safe

因为不是。

while the following program give you the illusion that it is actually async-signal safe?

您的程序与异步信号安全没有任何关系。您从此测试程序得出的关于异步信号安全性的任何结论都是完全错误的。

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

要了解 pthread_mutex_lock 不是异步信号安全的,请编写一个包含 3 个线程的程序:一个在紧密循环中执行 pthread_mutex_lockpthread_mutex_unlock,一个在来自信号处理程序 的相同互斥体 和第三个互斥体向进程发送无休止的 SIGHUP 流。

如果 pthread_mutex_lock 是异步信号安全的,这个程序将永远 运行。

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

即使不是,那个还是不代表pthread_mutex_lock是安全的,只是你还没有证明它是不安全.