2022年2022年跟我学Linux编程--多线程编程-同步 .pdf
《2022年2022年跟我学Linux编程--多线程编程-同步 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年跟我学Linux编程--多线程编程-同步 .pdf(3页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、多线程编程-同步在上一章节中,我们通过程序示例,见证了单线程世界中不可能发生的事件(一个数既是奇数又是偶数)在多线程环境中是怎样分分钟发生的,我通过细分程序执行步骤,分析了奇异事件发生的过程,并探明了其原因:一个线程在对全局变量gcnt 进行两次判读的过程中,另一个线刚好改变了这个变量的值。在多线程编程术语中,称这两个线程同时进入了临界区域。所谓 临界区域,是指多线程环境下两个及以上线程同时执行可能会导致冲突的一段代码。在上一章节的示例中,这几行代码就是一个临界区域:gcnt+;if(gcnt%2)if(!(gcnt%2)printf(%d:%dn,id,gcnt);冲突之所以会发生,是因为临
2、界区域的代码,通常需要很多个CPU 指令周期才能完成,其运行过程随时可能被打断(进行了线程调试),CPU去运行另外的线程,如果这个线程刚好也进入了临界区域,则异常的程序状态极可能会发生。如果当某个线程进入临界区域,在其退出区域之前,其他的线程无论如何也不能进入该区域,那么冲突就不会发生。Linux 提供了这种保证多线程进入临界区域互斥的机制,这正是本章节所要介绍的内容:线程锁。我们今天的示例程序还是在上一章节的示例上改进而来的,我们的任务就是使用线程锁,保证“一个数既是奇数又是偶数”的奇异事件在多线程环境下也不发生,代码如下:#include#include#include int gcnt=
3、0;pthread_mutex_t g_mutex;void*thread_task(void*arg)int id=(int)arg;while(1)pthread_mutex_lock(&g_mutex);gcnt+;if(gcnt%2)名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 3 页 -if(!(gcnt%2)printf(%d:%dn,id,gcnt);pthread_mutex_unlock(&g_mutex);usleep(1);return NULL;int main(int argc,char*argv)pthread_t thr;pthread_mutex
4、_init(&g_mutex,NULL);pthread_create(&thr,NULL,thread_task,(void*)1);pthread_create(&thr,NULL,thread_task,(void*)2);thread_task(void*)0);return 0;今天的程序相对于上章的代码,改动非常小,只添加了四行,已使用红色加粗 标注。我们一行行来分析:pthread_mutex_t g_mutex;这一行我们在程序中定义了一个线程锁对像。线程锁的类型为pthread_mutex_t,像普通的数据类型一个,它可以表态定义,也可以动态申请。pthread_mutex_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年跟我学Linux编程-多线程编程-同步 2022 Linux 编程 多线程 同步
限制150内