- 1、本文档共136页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[计算机软件及应用]多线程编程
* 生产者/消费者问题—程序代码(续) 线程通信 * 生产者/消费者问题—程序代码(续) 线程通信 * 生产者/消费者问题—程序代码(续) 线程通信 * 理发师问题 问题描述 一个理发店,只有一个理发师,只有n张可供顾客等待理发的椅子 理发师 如果没有顾客,则理发师睡觉 否则开始理发 如果椅子为空,则继续睡觉 顾客 如果进入理发店发现理发师在睡觉,则把他叫醒 如果发现理发师在理发,且有椅子为空,则坐下来等待 如果顾客发现椅子满,则离开 线程通信 * 理发师问题—PV操作描述 线程通信 * 理发师问题—程序代码 线程通信 * 理发师问题—程序代码 线程通信 * 理发师问题—程序代码 线程通信 * 理发师问题—程序代码 线程通信 第8章 多线程编程 * * * * * mutex变量示例1—修改后 线程通信 * mutex变量示例1—修改后 运行结果 线程通信 * mutex变量示例2—分析程序功能 线程通信 * mutex变量示例2—分析程序功能 线程通信 * mutex变量示例2—分析程序功能 线程通信 * mutex变量示例2—分析程序功能 线程通信 * 条件变量 互斥锁的缺点 通过控制存取数据来实现线程同步 线程需不断轮询条件是否满足(忙等),消耗很多资源 条件变量 利用线程间共享的全局变量实现同步 条件变量使线程睡眠等待特定条件出现(无需轮询) 使用方法 通常条件变量和互斥锁同时使用 一个线程因等待“条件变量的条件成立”而挂起 另一个线程使条件成立(给出条件成立信号) 线程通信 * 条件变量典型使用步骤 申明和初始化需要同步的全局数据/变量(如count) 申明和初始化一个条件变量对象 申明和初始化对应的mutex 创建若干进程并运行之 线程通信 * 条件变量典型使用步骤 进程1 进程2 1、执行工作直到必须等待特定条件(如计数器必须满足特定值); 2、对关联mutex上锁并检查全局变量的当前值; 3、调用ptread_cond_wait()进入阻塞等待,等待进程2发送的信号(说明:ptread_cond_wait()会自动对关联mutex解锁,以便可以被线程B使用); 4、接收到信号后,将唤醒并自动对关联mutex上锁; 5、显式对关联mutex解锁; 6、继续执行。 1、执行自身工作; 2、对关联mutex上锁并修改进程1所等待的全局变量的值; 3、检查进程1所等待的全局变量的值,若满足期待条件,调用pthread_cond_signal()向进程1发送信号; 4、显式对关联mutex解锁; 5、继续执行。 主线程 (join/continue) 线程通信 * 条件变量检测 条件的检测是在互斥锁的保护下进行的 如果条件为假,一个线程自动阻塞 如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件 线程通信 * 条件变量创建/销毁函数 pthread_cond_init (condition,attr) pthread_cond_destroy(condition) pthread_condattr_init(attr) pthread_condattr_destroy(attr) 线程通信 * 条件变量的初始化 声明条件变量:pthread_cond_t 类型 使用前必须初始化,有两种方法初始化方法 静态方式 pthread_cond_t condition=PTHREAD_COND_INITIALIZER 动态方式 int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr) 被创建的条件变量ID通过 参数返回给调用线程 该方法允许设置条件变量属性 线程通信 * 条件变量属性 条件属性仅仅定义一个属性:process-shared 允条件变量可以被其他进程中的线程访问 如果使用此条件变量属性,必须把它定义为pthread_condattr_t 类型(缺省定义为NULL) 说明 并不是所有的实现都提供process-shared属性 属性操作函数 pthread_condattr_init():创建条件变量属性对象 pthread_condattr_destroy():销毁条件变量属性对象 线程通信 * 条件变量的销毁 函数原型 int pthread_cond_destroy(pthread_cond_t *cond); 销毁所指定的条件变量,同时将会释放所给它分配的资源 调用该函数的线程并不要求等待在参数所指定的条件变量上 线程通信 * 条件变量的等待 函数原型 int pthread_cond_wait(pthread_cond_t *con
文档评论(0)