- 2
- 0
- 约4.82千字
- 约 4页
- 2017-06-08 发布于重庆
- 举报
[百度分享]linux线程同步浅析-睡眠与唤醒的秘密
一个程序问题? 之前写过这样一个C程序:模块维护一个工作线程、提供一组调用接口(分同步调用和异步调用)。用户调用模块提供的接口后,会向工作队列添加一个任务。然后任务由工作线程来处理。在同步调用情况下,接口调用后调用者被阻塞,等待工作线程处理完成后,将调用者唤醒。伪代码如下:? [调用接口]? add_command cmd, pid ; /* 1 */raise SIGSTOP ; /* 2 */get_response cmd ; /* 6 */[工作线程]? wait_for_command cmd, pid ; /* 3 */do_command cmd ; /* 4 */kill pid, SIGCONT ; /* 5 */调用接口向工作队列添加命令以后,向自己发送一个SIGSTOP信号,把自己挂起;工作线程处理命令完成,通过向调用者进程发送SIGCONT信号,将调用者唤醒。? 流程上还是比较清晰的,但是有点想当然了。测试发现,程序的执行流程可能变成下面的情况:? [调用接口]? add_command cmd, pid ; /* 1 */raise SIGSTOP ; /* 5 ... */get_response cmd ; ? [工作线程]? wait_for_command cmd, pid ; /* 2 */do_command cmd ; /* 3 */kill pid, SIGCONT ; /* 4 */调用者在添加命令后,发生调度,工作线程在调用者进入睡眠之前,先处理了命令并发出唤醒信号。之后,调用者再睡眠,就没办法被唤醒了。? 解决方法? 直接使用信号来实现睡眠和唤醒看来是不可取的,于是想到了使用pthread的互斥机制。改写后的程序如下:? [调用接口]? add_command cmd ; /* 1 */pthread_cond_wait cond ; /* 2 */get_response cmd ; /* 6 */[工作线程]? wait_for_command cmd, pid ; /* 3 */do_command cmd ; /* 4 */pthread_cond_signal cond ; /* 5 */测试发现,这样做就不会出现由于调度而出现“先唤醒、后睡眠”的问题了。? 但是,pthread条件变量是如何避免“先唤醒、后睡眠”的呢?实际上,它依然无法避免调用者在添加命令后,由于调度,造成pthread_cond_signal先于pthread_cond_wait发生的问题。但是条件变量内部记录了信号是否已发生,如果pthread_cond_signal先于pthread_cond_wait,则pthread_cond_wait将看到条件变量中记录的“信号已发生”,于是放弃睡眠。? man一下pthread_cond_signal可以看到如下流程:? [pthread_cond_wait mutex, cond ]? value cond- value; /* 1 */pthread_mutex_unlock mutex ; /* 2 */pthread_mutex_lock cond- mutex ; /* 10 */if value cond- value /* 11 */? me- next_cond cond- waiter;? cond- waiter me;? pthread_mutex_unlock cond- mutex ; /* X */? unable_to_run me ; /* Y */ elsepthread_mutex_unlock cond- mutex ; /* 12 */pthread_mutex_lock mutex ; /* 13 */[pthread_cond_signal cond ]? pthread_mutex_lock cond- mutex ; /* 3 */cond- value++; /* 4 */if cond- waiter /* 5 */? sleeper cond- waiter; /* 6 */? cond- waiter sleeper- next_cond; /* 7 */? able_to_run sleeper ; /* 8 */ pthread_mutex_unlock cond- mutex ; /* 9 */这份伪代码中的cond- value就是用于记录“信号已发生”的变量。? 深入一点? 如果你足够细心,可能已经发现上面的pthread的伪代码是有
您可能关注的文档
- Pause键在英语听力教学中的合理运用.doc
- P2P投资人教育面临的挑战.doc
- PC与HMI的通信协议.doc
- PDCA提升管理水平的良药.doc
- Phabricator入门手册.doc
- photoshop图片合成PS图片合成_移花接木教程.doc
- photoshop红眼工具的使用.doc
- photoshop去除图片上文字或水印的6种方法.docx
- PLSQL_解决首次登录无tables问题(经验之谈).doc
- POS机简易使用手册.doc
- 小区绿化施工协议书.docx
- 墙面施工协议书.docx
- 1 古诗二首(课件)--2025-2026学年统编版语文二年级下册.pptx
- (2026春新版)部编版八年级道德与法治下册《3.1《公民基本权利》PPT课件.pptx
- (2026春新版)部编版八年级道德与法治下册《4.3《依法履行义务》PPT课件.pptx
- (2026春新版)部编版八年级道德与法治下册《6.2《按劳分配为主体、多种分配方式并存》PPT课件.pptx
- (2026春新版)部编版八年级道德与法治下册《6.1《公有制为主体、多种所有制经济共同发展》PPT课件.pptx
- 初三教学管理交流发言稿.docx
- 小学生课外阅读总结.docx
- 餐饮门店夜经济运营的社会责任报告(夜间贡献)撰写流程试题库及答案.doc
最近下载
- 2025年陕西省汉中市某中学小升初入学分班考试英语考试真题含答案.docx VIP
- DB31T 1236-2020 未成年人司法社会工作服务规范.docx VIP
- 宣贯培训(2026年)《DLT 2772—2024火力发电厂输煤廊道巡检装置技术规范》.pptx VIP
- 2026年北京中考白皮书.pdf VIP
- 2025届苏锡常镇高三(一模)数学试题及参考答案.pdf VIP
- 《人工智能辅助的翻译技术》课件.ppt VIP
- 沉浸式非遗体验—宋代点茶.pptx VIP
- PET Complete精品教学课件 unit 3 having fun.pptx
- 年产2万吨马铃薯全粉项目可行性研究报告.docx
- 《计算机网络基础》课件——OSI参考模型.pptx VIP
原创力文档

文档评论(0)