Linux下多线程并发控制的机制分析

Linux下多线程并发控制的机制分析

ID:39465440

大小:551.40 KB

页数:13页

时间:2019-07-04

Linux下多线程并发控制的机制分析_第1页
Linux下多线程并发控制的机制分析_第2页
Linux下多线程并发控制的机制分析_第3页
Linux下多线程并发控制的机制分析_第4页
Linux下多线程并发控制的机制分析_第5页
资源描述:

《Linux下多线程并发控制的机制分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Linux下多线程并发控制的机制分析一、Linux下并发控制原因及方法1.1、并发控制如果在对linux字符设备驱动实例进行分析时,我们可能会有一个疑问,当我们调用copy_to_user和copy_from_user函数完成从用户态、内核态的读写操作的时候,如果这两个操作并发执行的话会出现一个什么样的情况?那肯定是会出现问题的,这个很容易理解,那么我们怎么去解决这一类似的问题呢?这就是我现在要探讨的linux并发控制机制。我们在设备驱动的编写过程中要解决的一个问题就是并发的控制,也就是进程对共享资源的并发访问,而在linux中,提供了多个解决并发控制的方式,比如:中断屏蔽、原子操作、互

2、斥锁等,下面将逐一介绍。1.2、中断屏蔽中断屏蔽的概念实际上就是平常所说的开中断、关中断。在单cpu中使用中断屏蔽来避免竟态是很方便的一种方法,每次在进入临界区之前屏蔽所有的中断,访问完成后再打开中断。这项功能可以保障在执行的内核执行路径不被中断处理程序所抢占。它将使得中断与进程之间的并发不在发生,而且由于linux内核的进程调度都依赖于中断来实现,所以这样也就可以避免进程之间的并发。中断对于内核的运行是非常重要的,在中断屏蔽期间,所有的中断都无法得到处理,因此长时间的屏蔽中断是很危险的,可能会造成数据丢失、系统崩溃等严重的后果。这就要求临界区的执行应该尽可能的快。1.3、原子操作原子操

3、作,指的是在执行的过程中不会被中断的操作。linux内核提供了一系列的函数来完成原子操作,内核代码可以安全的调用他们而不被打断。1.4、自旋锁-12-自旋锁是一种典型的互斥访问临界资源的手段。为何叫自旋锁,还得从他的工作机制说起。为了获得一个自旋锁,在cpu上运行的代码需要先执行一个原子操作,该操作测试并设置某个内存变量,而且在操作完成之前无法被打断,即别的执行单元是不能访问这个内存变量的。当测试结果表明锁已空闲,那么程序就获得者个自旋锁并继续执行它,如果测试表明锁被占用,那么程序则一直重复测试操作直到锁空闲为止,这就是自旋的概念。理解一个自旋锁也不是很困难,我们可以把它当成一个变量来看

4、待,就像原子变量。比如两个执行单元A、B,如果A先进入,那么它将持有锁,当B也想进入的时候,但是测试出锁已经被占有,那么它将一直等待锁被释放后再进入。二、程序功能设计为了研究Linux下的多线程机制,设计生产者和消费者研究程序,程序结构如下图所示:图1.1程序结构图主线程负责创建生产者线程和消费者线程。主线程同时还负责观察产品仓库的情况,它每5秒查看一次仓库的大小和剩余产品。生产者线程在启动以后,负责生产产品,并且往产品仓库里面放。消费者线程在启动以后,负责消费产品,从产品里面取出产品。-12-当生产者线程把产品仓库放满以后,就不再生产产品,而是等待消费者取走产品后再生产。消费者把仓库取

5、空之后,就不再从仓库中取产品,而是等待生产者生产产品后再取。三、程序实现环境:操作系统:RHEL5,语言:C++。在Linux中,使用Pthread库来操作线程。POSIXthread是一个标准线程定义,该标准定义一系列的多线程标准。pthreads线程库实现了POSIX线程标准,定义了一套CC++语言下的线程库。首先需要定义生产者线程、消费者线程、产品仓库等,在本例中,使用pthread线程库,所以生产者线程和消费者线程都定义为pthread_t类型;产品仓库则使用一个先进先出的队列来实现,这个队列类型直接使用了stl库中的list结构。//定义生产者和消费者线程pthread_tp

6、roducer,consumer;//定义产品仓库,用List结构来保存。liststoreList;在主线程中使用pthread_create方法来创建了生产者线程和消费者线程,创建线程主要需要传入pthread_t类型的线程对象,以及线程的工作方法。如果线程创建函数返回的值不为0,则表示线程创建失败,可能由于没有足够的系统资源。//创建生产者线程,并使其工作。ret=pthread_create(&producer,NULL,producer_work,NULL);//创建消费者线程,并使其工作。ret1=pthread_create(&consumer,NULL,cons

7、umer_work,NULL);//如果线程创建函数返回的值不为0,则表示线程创建失败,可能由于没有足够的系统资源。if(ret!=0

8、

9、ret1!=0){cout<<"创建线程错误!";exit(1);}-12-在生产者线程的工作代码(producer_work方法)中,首先用死循环来保证它一直在工作,每一次的工作逻辑如下:a.判断仓库大小,如果仓库未满,则往仓库里放入产品。b.放完产品以后,判断消费者线程是否在睡眠状态,如果

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

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

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