为什么pthread_mutex_lock未标记为异步信号安全?

问题描述 投票:0回答:1

[您看到,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以获取异步信号安全功能列表。

linux unix pthreads signals posix
1个回答
0
投票

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

因为不是。

虽然下面的程序给您错觉,它实际上是异步信号安全的?

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

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

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

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

但是我希望您会看到,该程序将在一段时间后崩溃或死锁。

即使不是,[也并不意味着pthread_mutex_lock是安全的,只是您尚未证明它是unsafe

© www.soinside.com 2019 - 2024. All rights reserved.