linux - 为什么 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
获取异步信号安全功能列表。
解决方案
但是为什么 pthread_mutex_lock 没有被标记为异步信号安全
因为它不是。
而下面的程序让你错觉它实际上是异步信号安全的?
您的程序与异步信号安全无关。您从这个测试程序得出的任何关于异步信号安全的结论都是完全错误的。
异步信号安全是关于能够从异步信号处理程序调用函数。
要查看这pthread_mutex_lock
不是异步信号安全的,请编写一个具有 3 个线程的程序:一个在紧密循环中执行pthread_mutex_lock
,一个在来自信号处理程序pthread_mutex_unlock
的同一个互斥体上执行相同操作,第三个将无休止的s 流发送到过程。SIGHUP
如果pthread_mutex_lock
异步信号安全,该程序将永远运行。
但我希望你会观察到这个程序会在一段时间后崩溃或死锁。
即使它没有,那仍然不意味着它pthread_mutex_lock
是安全的,只是你还没有证明它是不安全的。
推荐阅读
- php - Laravel - 将控制台输出写入日志文件
- c# - 如何自动将自定义用户属性添加到 Outlook VSTO 中的所有新回复
- html - 加载列表时,Angular 8 表单控件冻结
- amazon-web-services - 使用詹金斯在 jboss 上部署战争
- python - 同一种子的 Python 随机数生成不同
- css - CSS网格如何使用自动适应设置的列数
- amazon-web-services - 如何在 EC2 上的 docker 内使用 AWS 凭证运行命令?
- android - 24*7 运行 Android 服务
- reactjs - 有状态功能组件重新渲染
- python-3.x - 如何在 python 中使用 opencv 读取数据矩阵代码?