linux多线程编程之同步与互斥实例讲解

linux多线程编程之同步与互斥实例讲解

ID:13022256

大小:94.50 KB

页数:11页

时间:2018-07-20

linux多线程编程之同步与互斥实例讲解_第1页
linux多线程编程之同步与互斥实例讲解_第2页
linux多线程编程之同步与互斥实例讲解_第3页
linux多线程编程之同步与互斥实例讲解_第4页
linux多线程编程之同步与互斥实例讲解_第5页
资源描述:

《linux多线程编程之同步与互斥实例讲解》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、linux多线程编程之同步与互斥实例讲解时间:2013-10-1413:12来源:武汉华嵌作者:张老师点击:278次Linux多线程同步与互斥问题作者:武汉华嵌教学部讲师张老师一、为什么要用多线程技术?1.避免阻塞,大家知道,单个进程只有一个主线程,当主线程阻塞的时候,整个进程也就阻  作者:武汉华嵌教学部讲师张老师一、为什么要用多线程技术?1.避免阻塞,大家知道,单个进程只有一个主线程,当主线程阻塞的时候,整个进程也就阻塞了,无法再去做其它的一些功能了。2.避免CPU空转,应用程序经常会涉及到RPC,数

2、据库访问,磁盘IO等操作,这些操作的速度比CPU慢很多,而在等待这些响应时,CPU却不能去处理新的请求,导致这种单线程的应用程序性能很差。3.提升效率,一个进程要独立拥有4GB的虚拟地址空间,而多个线程可以共享同一地址空间,线程的切换比进程的切换要快得多。二、如何使用多线程技术进行编程?首先给一个完整的多线程程序,以下是最简单的模拟火车票售票系统:#include#include#include#include#include<

3、unistd.h>void*ticketport1(void*);//线程函数声明void*ticketport2(void*);//线程函数声明inttickets=100;//火车票的起始值intmain(){pthread_tid1,id2;intret;ret=pthread_create(&id1,NULL,ticketport1,NULL);//创建线程1if(ret<0){perror("creatthread1:");exit(-1);}ret=pthread_create(&id2,NU

4、LL,ticketport2,NULL);//创建线程2if(ret<0){perror("creatthread2:");exit(-1);}pthread_join(id1,NULL);//等待线程1结束pthread_join(id2,NULL);//等待线程2结束return0;}void*ticketport1(void*arg){while(1){if(tickets>0){//usleep(1000);//售票点1每卖一张票,自减一printf("ticketport1sellsticket

5、:%d",tickets--);}else{break;}}return(void*)0;}void*ticketport2(void*arg){while(1){if(tickets>0){//usleep(1000);//售票点2每卖一张票,自减一printf("ticketport2sellsticket:%d",tickets--);}else{break;}}return(void*)0;}我们用pthread_create函数来创建线程,用pthread_join来阻塞主线程,等待子线

6、程执行完成后返回。利用了多线程技术来创建了两个售票点,可以不同的地方进行同时售票。用gcc带选项-lpthread来连结pthread库函数。执行这个程序发现两个售票点在正常售票,一部分连续是ticketport1,另一部分连续是ticketport2;此时,其实存在一个隐含的问题,就是线程间的切换,在单CPU系统中,CPU是有时间片时间,时间片到了,就要执行其它的线程,假设thread1执行到if里面,但在printf执行前发生了线程切换,那么会发生什么呢?我们在这里用usleep函数(放开程序中的us

7、leep注释行)进行强制模拟切换,编译运行程序发现竟然有0号票被卖出了,这显然是错误的!当thread1的if里面发生线程切换时,thread2得到运行,把最后一张票卖了,此时thread1恢复运行,结果卖出了0号票,这里我们需要的是火车票的票数数据对于所有线程而言是同步的,所以就要用到线程同步技术了。三、使用多线程的同步与互斥1、多线程的同步方式有很多种,例如互斥锁,条件变量,信号量,读写锁。先看看互斥锁如何解决多线程之间的同步问题。程序用互斥锁后如下:#include#include

8、#include#include#includevoid*ticketport1(void*);void*ticketport2(void*);inttickets=100;pthread_mutex_tmutex;intmain(){intret;pthread_tid1,id2;pthread_mutex_init(&mutex,NULL);/

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

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

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