




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
linux多线程机制线程同步1引言目前,许多流行的多任务操作系统都提供线程机制,线程就是程序中的 单个顺序控制流。利用多线程进行程序设计,就是将一个程序(进程)的任务划分为执行的多个部分(线程) ,每一个线程为一个顺序的单控制流,而所有线程都是并发执行的,这样,多线程程序就可以实现并行计算,高效利用多处理器。线程可分为用户级线程和内核级线 程两种基本类型。用户级线程不需要内核支持,可以在用户程序中实现,线程调度、同步与互斥都需要用户程序自己完成。内核级线程需要内核参与,由内核完成线 程调度并提供相应的系统调用,用户程序可以通过这些接口函数对线程进行一定的控制和管理。Linux操作系统提供了LinuxThreads库,它是符合POSIX1003.1c标准的内核级多线程函数库。在linuxthreads库中提供了一些多线程编程的关键函数,在多线程编程时应包括pthread.h文件。2.LinuxThread中的关键库函数2.1线程的创建和终止int pthread_create(pthread_t * pthread,const pthread_attr_t *attr,void *(*start_routine(*void),void *arg);调用此函数可以创建一个新的线程,新线程创建后执行start_routine 指定的程序。其中参数attr是用户希望创建线程的属性,当为NULL时表示以默认的属性创建线程。arg是向start_routine 传递的参数。当成功创建一个新的线程时,系统会自动为新线程分配一个线程ID号,并通过pthread 返回给调用者。void pthread_exit(void *value_ptr);调用该函数可以退出线程,参数value_ptr是一个指向返回状态值的指针。2.2线程控制函数pthread_self(void);为了区分线程,在线程创建时系统为其分配一个唯一的ID号,由pthread_create()返回给调用者,也可以通过pthread_self()获取自己的线程ID。Int pthread_join (pthread- t thread , void * *status);这个函数的作用是等待一个线程的结束。调用pthread_join()的线程将被挂起直到线程ID为参数thread 指定的线程终止。int pthread_detach(pthread_t pthread);参数pthread代表的线程一旦终止,立即释放调该线程占有的所有资源。2.3线程间的互斥互斥量和临界区类似,只有拥有互斥量的线程才具有访问资源的权限, 由于互斥对象只有一个,这就决定了任何情况下共享资源(代码或变量)都不会被多个线程同时访问。使用互斥不仅能够在同一应用程序的不同线程中实现资源的安 全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。Linux中通过pthread_mutex_t来定义互斥体机制完成互斥操作。具体的操作函数如下pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr);初使化一个互斥体变量mutex,参数attr表示按照attr属性创建互斥体变量mutex,如果参数attr为NULL,则以默认的方式创建。pthread_mutex_lock(pthread_mutex_t *mutex);给一个互斥体变量上锁,如果mutex指定的互斥体已经被锁住,则调用线程将被阻塞直到拥有mutex的线程对mutex解锁为止。Pthread_mutex_unlock(pthread_mutex_t *mutex);对参数mutex指定的互斥体变量解锁。2.4线程间的同步同步就是线程等待某一个事件的发生,当等待的事件发生时,被等待的线程和事件一起继续执行。如果等待的事件未到达则挂起。在linux操作系统中是通过条件变量来实现同步的。Pthread_cond_init(pthread_cond_t *cond,const pthread_cond_t *attr);这个函数按参数attr指定的属性初使化一个条件变量cond。Pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);等待一个事件(条件变量)的发生,发出调用的线程自动阻塞,直到相应的条件变量被置1。等待状态的线程不占用CPU时间。pthread_cond_signal(pthread_cond_t *cond);解除一个等待参数cond指定的条件变量的线程的阻塞状态。3多线程编程的应用实例在这里利用多线程技术实现生产者和消费者问题,生产者线程向一缓冲区中写数据, 消费者线程从缓冲区中读取数据,由于生产者线程和消费者线程共享同一缓冲区,为了正确读写数据,在使用缓冲队列时必须保持互斥。生产者线程和消费者线程必 须满足:生产者写入缓冲区的数目不能超过缓冲区容量,消费者读取的数目不能超过生产者写入的数目。在程序中使用了一个小技巧来判断缓冲区是空还是满。在初 始化时读指针和写指针为0;如果读指针等于写指针,则缓冲区是空的;如果(写指针+ 1) % N 等于读指针,则缓冲区是满的,%表示取余数,这时实际上有一个单元空出未用。下面是完整的程序段和注释。#include#include#define BUFFER_SIZE 8struct prodcons int bufferBUFFER_SIZE;pthread_mutex_t lock; /互斥LOCKint readpos , writepos;pthread_cond_t notempty; /缓冲区非空条件判断pthread_cond_t notfull; /缓冲区未满条件判断;void init(struct prodcons * b)pthread_mutex_init(&b-lock,NULL);pthread_cond_init(&b-notempty,NULL);pthread_cond_init(&b-notfull,NULL);b-readpos=0;b-writepos=0;void put(struct prodcons* b,int data)pthread-_mutex_lock(&b-lock);if(b-writepos + 1) % BUFFER_SIZE = b-readpos)pthread_cond_wait(&b-notfull, &b-lock) ;b-bufferb-writepos=data;b-writepos+;if(b-writepos = BUFFER_SIZE)b-writepos=0;pthread_cond_signal(&b-notempty);pthread_mutex_unlock(&b-lock);int get(struct prodcons *b)int data;pthread_mutex_lock(&b-lock);if(b-writepos = b-readpos)pthread_cond _wait(&b-notempty, &b-lock);data = b-bufferb-readpos;b-readpos+;if(b-readpos = BUFFER_SIZE)b-readpos=0;pthread_cond_signal(&b-notfull);pthread_mutex_unlock(&b-lock);return data;#define OVER (-1)struct prodcons buffer;void *producer(void *data)int n;for(n = 0; n 10000; n+)printf(%d n, n) ;put(&buffer, n);put(&buffer, OVER);return NULL;void *consumer(void * data)int d;while(1)d = get(&buffer);if(d = OVER)break;printf(%dn, d);return NULL;int main(void)pthread_t th_a, th_b;void *retval;init(&buffer);pthread_create(&th_a, NULL, producer, 0);& nbsp; pthread_create(&th_b, NULL, consumer, 0);pthread_join(th_a, &retval);pthread_join(th_b, &retval);return 0;上 面的例子中,生产者负责将1到1000的整数写入缓冲区,而消费者负责从同一个缓冲区中读取写入的整数并打印出来。因为生产者和消费者是两个同时运行的线 程,并且要使用同一个缓冲区进行数据交换,因此必须利用一种机制进行同步。通过上面的例子我们可以看到,多线程的最大好处是,除堆栈之外,几乎所有的数据 均是共享的,因此线程间的通讯效率很高;缺点:因为共享所
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 铅山县葛仙山景区旅游公路开发建设工程可行性研究报告
- 提高药品生产企业环保达标率
- 技术试题及答案百度
- 防汛课件教学课件
- 2025年中学纪念九一八事变活动方案5篇
- 礼仪服务公司合同付款管理办法
- 智慧管廊运维管理平台
- 防暑降温防护知识培训课件
- 广告策划品牌整合与传播
- 金融工程行业技术规范与标准研究
- 初中物理“秒表的读数”专项练习题-专题同类题【含答案;详细解释,word版;可编辑】
- 口腔医院院感工作指导手册2022版
- 八年级物理上册《第一章 机械运动》单元测试卷及答案(人教版)
- MySQL数据库PPT完整全套教学课件
- 2023年浙江台州温岭市禁毒办招聘禁毒社工笔试备考题库及答案解析
- 2023主题学习教育知识点总结归纳(应知应会手册)
- 铜陵市绿阳建材有限责任公司《60 万吨-年磷石膏综合利用技术改造项目》环境影响报告
- 检验标本的采集
- 二氧化碳气体保护焊培训
- 生理学第九章 感觉器官的功能
- 五年级上册美术课件-15 造型别致的椅子|人美版
评论
0/150
提交评论