- 1、本文档共124页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2.5.3 线程的访问控制 多个线程阻塞在此条件变量上时,哪一个线程被唤醒是由线程的调度策略所决定的。 注意,必须用保护条件变量的互斥锁来保护这个函数,否则条件满足信号y有可能在测试条件和调用pthread_cond_wait函数之间被发出,从而造成无限制的等待。 cond.c是使用条件变量实现线程同步的一个简单的例子。 3、信号量 互斥锁主要是用来实现多线程多任务的互斥,一个线程占用了某一个独占资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。 而信号量更多用来处理多线程之间的同步,用它来控制对公共资源的访问。当公共资源增加时,增加信号量。使用后,减少信号量。 只有当信号量值大于0时,才能使用公共资源。 这里的公共资源,也可以一些计算或者数据处理。 信号量也称为信号灯,本质上是一个非负的整数计数器。 2.5.3 线程的访问控制 信号灯与互斥锁和条件变量的主要不同在于”灯”的概念. 灯亮则意味着资源可用,灯灭则意味着不可用。 互斥锁的同步方式侧重于”等待”操作,即资源不可用;信号灯机制则侧重于点灯,即告知资源可用。 信号灯的应用除了灯亮/灯灭这种二元灯以外,也可以采用大于1的灯数,以表示资源数大于1,这时可以称之为多元灯。 2.5.3 线程的访问控制 (1)信号量的创建 所需头文件:#include semaphore.h (信号量函数都需要包含这个头文件,后面其余函数讲解时将不再重复列出) 函数原型:int sem_init(sem_t *sem, int pshared, unsigned int value) 这是创建信号灯的API,其中value为信号灯的初值,pshared表示是否为多进程共享而不仅仅是用于一个进程。pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享;value给出了信号量的初始值。Linux线程没有实现多进程共享信号灯,因此所有非0值的pshared输入都将使sem_init()返回-1,且置errno为ENOSYS。初始化好的信号灯由sem变量表征,用于以下点灯、灭灯操作。 (2)信号量的注销 函数原型:int sem_destroy(sem_t * sem) 被注销的信号灯sem要求已没有线程在等待该信号灯,否则返回-1,且置errno为EBUSY。 2.5.3 线程的访问控制 (3)点灯 点灯函数原型:int sem_post(sem_t * sem) 点灯操作将信号灯值原子地加1,表示增加一个可访问的资源。 (4)灭灯 函数原型:int sem_wait(sem_t * sem) int sem_trywait(sem_t * sem) sem_wait()为等待灯亮操作,等待灯亮(信号灯值大于0),然后将信号灯原子地减1,并返回。 sem_trywait()为sem_wait()的非阻塞版,如果信号灯计数大于0,则原子地减1并返回0,否则立即返回-1,errno置为EAGAIN。 (5)获取灯值 函数原型:int sem_getvalue(sem_t * sem, int * sval) 读取sem中的灯计数值,表示可用资源的个数,存于*sval中,并返回0 2.5.3 线程的访问控制 函数int sem_wait(sem_t * sem);和int sem_post(sem_t * sem);中的参数sem都是由sem_init调用初始化的信号量对象的指针做参数。 很多时候,互斥锁和信号量需要配合使用。 信号量程序实例sema.c 2.5.4 “生产者消费者”实验 生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题. 两个进程共享一个公共的固定大小的缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一个是消费者,用于从缓冲区中取出消息。 当缓冲区已经满了,生产者还想向其中放入一个新的数据项时,需要让生产者进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它。 同样地,当缓冲区已经空了,而消费者还想去取消息,此时也要让消费者进行休眠,等待生产者放入一个或者多个数据时再唤醒它。 为了跟踪缓冲区中的消息数目,需要一个变量 count。如果缓冲区最多存放 N 个消息,则生产者的代码会首先检查 count 是否达到 N,如果是,则生产者休眠;否则,生产者向缓冲区中放入一个消息,并增加 count 的值。 消费者的代码也与此类似,首先检测 count 是否为 0,如果是,则休眠;否则,从缓冲区中取出消息并递减 count 的值。同时,每个进程也需要检查是否需要唤醒另一个进程。 2.5.4 “生产者消费者”实验
您可能关注的文档
最近下载
- 体例格式9:工学一体化课程《小型网络安装与调试》任务3学习任务工作页.docx VIP
- 2025时事政治必刷题(含答案).pdf
- 循环爆破振动作用下边坡稳定性计算方法研究.docx VIP
- 通道闸常见问题及处理方法培训第五版.doc VIP
- 25题造价工程师岗位常见面试问题含HR问题考察点及参考回答.pdf VIP
- 《无废港口建设指南》(T CIN 076—2025).pdf VIP
- 外科护理学重点[共7页].pdf VIP
- 护士资格考试《儿科护理学》习题及答案.docx VIP
- 违法车辆拖移保管项目停车场地管理方案.docx VIP
- 体例格式9:工学一体化课程《小型网络安装与调试》任务4学习任务工作页.docx VIP
文档评论(0)