跟我学linux编程-12-多线程编程-同步

跟我学linux编程-12-多线程编程-同步

ID:34499685

大小:38.00 KB

页数:3页

时间:2019-03-07

跟我学linux编程-12-多线程编程-同步_第1页
跟我学linux编程-12-多线程编程-同步_第2页
跟我学linux编程-12-多线程编程-同步_第3页
资源描述:

《跟我学linux编程-12-多线程编程-同步》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、多线程编程-同步在上一章节中,我们通过程序示例,见证了单线程世界中不可能发生的事件(一个数既是奇数又是偶数)在多线程环境中是怎样分分钟发生的,我通过细分程序执行步骤,分析了奇异事件发生的过程,并探明了其原因:一个线程在对全局变量gcnt进行两次判读的过程中,另一个线刚好改变了这个变量的值。在多线程编程术语中,称这两个线程同时进入了临界区域。所谓临界区域,是指多线程环境下两个及以上线程同时执行可能会导致冲突的一段代码。在上一章节的示例中,这几行代码就是一个临界区域:gcnt++;if(gcnt%2){if(!(gcnt%2))printf("[%d]:%d",id

2、,gcnt);}冲突之所以会发生,是因为临界区域的代码,通常需要很多个CPU指令周期才能完成,其运行过程随时可能被打断(进行了线程调试),CPU去运行另外的线程,如果这个线程刚好也进入了临界区域,则异常的程序状态极可能会发生。如果当某个线程进入临界区域,在其退出区域之前,其他的线程无论如何也不能进入该区域,那么冲突就不会发生。Linux提供了这种保证多线程进入临界区域互斥的机制,这正是本章节所要介绍的内容:线程锁。我们今天的示例程序还是在上一章节的示例上改进而来的,我们的任务就是使用线程锁,保证“一个数既是奇数又是偶数”的奇异事件在多线程环境下也不发生,代码如下:#

3、include#include#includeintgcnt=0;pthread_mutex_tg_mutex;void*thread_task(void*arg){intid=(int)arg;while(1){pthread_mutex_lock(&g_mutex);gcnt++;if(gcnt%2){if(!(gcnt%2))printf("[%d]:%d",id,gcnt);}pthread_mutex_unlock(&g_mutex);usleep(1);}returnNULL;}intmai

4、n(intargc,char*argv[]){pthread_tthr;pthread_mutex_init(&g_mutex,NULL);pthread_create(&thr,NULL,thread_task,(void*)1);pthread_create(&thr,NULL,thread_task,(void*)2);thread_task((void*)0);return0;}今天的程序相对于上章的代码,改动非常小,只添加了四行,已使用红色加粗标注。我们一行行来分析:pthread_mutex_tg_mutex;这一行我们在程序中定义了一个线程锁对像。线程

5、锁的类型为pthread_mutex_t,像普通的数据类型一个,它可以表态定义,也可以动态申请。pthread_mutex_init(&g_mutex,NULL);我们在main函数的一开始,调用pthread_mutex_init对线程锁进行了初始化。pthread_mutex_init有两个参数,前者是线程锁对像,以指针的形式传递,第二个参数是线程锁的初始化参数,用于定义线程锁的类型,通常传NULL。线程锁也可以通过赋初值的形式初始化,上面两行代码等价于如下的一行:pthread_mutex_tg_mutex=PTHREAD_MUTEX_INITIALIZER;

6、我们通过上述方法定义并初始化了一把互斥锁。除了互斥锁,线程锁还有其它的类型,通过初始化过程确定,如果读者有兴趣,可以查阅相关资料补充学习。需要提出的是,如果没有特殊需要,我们线程过程中使用这种类型的锁就行了,使用其它类型锁前,请一定一定三思再三思!!!pthread_mutex_lock(&g_mutex);pthread_mutex_unlock(&g_mutex);加锁与解锁,这两行代码通常要成对出现,lock在临界区域的第一行代码之前,unlock紧跟在临界区域的最后一行代码之后,保证了临界区域同一时刻,只有一个线程能够进入。共原理如下:1当线程调用pthre

7、ad_mutex_lock时,会对线程锁对像进行检测,如果线程锁已被其他线程lock了,则线程一直等待,直至其它线程都调用了unlock释放了该锁。2当锁未被其他线程锁定时,pthread_mutex_lock函数标识锁被当前线程锁定,并返回,程序继续向下运行。我们称之为该线程获得了锁,或者占用了锁。3当线程调用pthread_mutex_unlock时,解除本线程对锁的锁定状态,并返回,程序继续向下运行。我们称之为该线程释入了锁。当锁被占用线程释放后,其它线程(包括本线程)可以获得该锁。我们今天的示例程序保存为thread3.c,编译执行:gccthread3

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。