[您看到,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
以获取异步信号安全功能列表。
但是为什么pthread_mutex_lock没有标记为异步信号安全
因为不是。
虽然下面的程序给您错觉,它实际上是异步信号安全的?
您的程序与无关与异步信号安全有关。从此测试程序得出的关于异步信号安全性的任何结论都是错误的。
异步信号安全性是关于能够调用函数from异步信号处理程序。
[要查看pthread_mutex_lock
不是异步信号安全,请编写一个具有3个线程的程序:一个在紧密循环中执行pthread_mutex_lock
和pthread_mutex_unlock
,一个在同一个互斥体上执行相同的操作来自信号处理程序,然后是第三个将SIGHUP
s无休止的流发送到进程。
如果pthread_mutex_lock
是异步信号安全的,则此程序将永远运行。
但是我希望您会看到,该程序将在一段时间后崩溃或死锁。
即使不是,[pthread_mutex_lock
是安全的,只是您尚未证明它是unsafe。