



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
pthread_mutex_lock的双重加锁后死锁特性一段示例代码,想说明一下可重入函数。所以我在一个函数中使用了pthread_mutex_lock,来说明一旦函数使用了锁,就变成了不可重入的函数。#include #include #include #include #include #include static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;static const char * const caller2 = main, signal handler;static volatile int signal_handler_exit = 0;static void hold_mutex(int c) printf(enter hold_mutex caller %sn, callerc); pthread_mutex_lock(&mutex); /* 保证信号函数退出前, main线程始终拥有锁 */ while (!signal_handler_exit & c != 1) sleep(5); pthread_mutex_unlock(&mutex); printf(leave hold_mutex caller %sn, callerc);static void signal_handler(int signum) hold_mutex(1); signal_handler_exit = 1;int main() signal(SIGALRM, signal_handler); alarm(3); hold_mutex(0); return 0; 上面代码很简单,main函数调用hold_mutex来持有锁。hold_mutex直到SIGALRM信号处理函数返回后,才会释放锁和退出。同时,main利用alarm,在3秒后可以收到信号SIGALRM,而SIGALRM的信号处理函数也会调用hold_mutex。这就保证了,在main线程持有锁的过程中,通过信号处理机制,再次进入hold_mutex,来造成“死锁”的场景。用以说明hold_mutex是不可重入的。可是运行结果让我很意外。fgaofgao test#./a.outenter hold_mutex caller mainenter hold_mutex caller signal handlerleave hold_mutex caller signal handlerleave hold_mutex caller mainfgaofgao test# 这是怎么回事呢?为什么在main拿到锁以后,信号处理函数还是可以拿到锁呢?我决定在这样试一下,直接在hold_mutex中再次拿锁。 代码变成了下面这样:#include #include #include #include #include #include static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;static void hold_mutex(int c) if (c = 0) return; printf(enter hold_mutex caller %dn, c); pthread_mutex_lock(&mutex); hold_mutex(c-1); pthread_mutex_unlock(&mutex); printf(leave hold_mutex caller %dn, c);int main() hold_mutex(3); return 0; 执行结果如下:fgaofgao test#./a.outenter hold_mutex caller 3enter hold_mutex caller 2enter hold_mutex caller 1leave hold_mutex caller 1leave hold_mutex caller 2leave hold_mutex caller 3fgaofgao test# 看到这样的结果,我首先想到难道pthread_mutex_lock是递归锁?但仔细想了想,又推翻了这个想法。递归锁是一种特殊的锁,不大可能会作为默认行为。当我盯着pthread_mutex_lock这个名字,pthread这个关键字给我带来了提示。这个锁是否是跟线程相关呢?当该线程拥有了该锁后,可以继续上锁呢?重读了一遍manual手册,证实了自己的想法。 The mutex object referenced by mutex shall be locked by calling pthreadmutexlock(). If the mutex is already locked, the calling thread shall block until the mutex becomes available.This operation shall return with the mutex object referenced by mutex in the locked state with t
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新浪微博生态合作协议书
- 教心学试题及答案
- 共享理念相关题目及答案
- 2025年直流斩波调压牵引装置合作协议书
- 简述国际法的特征
- 2025年工业VOC治理系统合作协议书
- 扫描隧道显微镜课件
- 2025年渔船船员考试题目及答案
- 慢性病课件教学课件
- 慢性咳嗽的诊治进展
- 630KVA箱变安装工程施工设计方案
- 《CRISPR-Cas9及基因技术》课件
- DBJ51T 195-2022 四川省纵向增强体心墙土石坝技术规程
- 农家乐大学生创业计划书
- 《马克思生平故事》课件
- 主动脉夹层临床医学专业教学系列课件讲解
- 天津市河北区2024-2025学年九年级上学期12月月考数学试题(含答案)
- 中医预防老年痴呆方案
- 内墙刮大白分包合同模板2025年
- 建设弹簧项目环评资料环境影响
- 青少年足球训练安全保障措施
评论
0/150
提交评论