- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
函数原型 #includepthread.h int pthread_cond_signal(pthread_cond_t *cond); int pthread_cond_broadcast(pthread_cond_t *); 参数与返回值 cond:条件变量 成功返回0,否则返回错误编号 * 等待线程 调用pthread_mutex_lock While(判断条件)pthread_cond_wait 重复检查条件是由于线程可能不是被pthread_cond_signal唤醒,可能是由信号等唤醒 调用pthread_mutex_unlock 被等待线程 调用pthread_mutex_lock 修改条件 调用pthread_mutex_unlock 调用pthread_mutex_broadcast等 * POSIX.1说明:pthread_cond_broadcast等函数的调用无需考虑调用线程是否拥有锁,并建议在在lock和unlock以外的区域调用。为什么? * 假设系统中有线程1和线程2 线程1获取mutex,在进行数据处理的时候,线程2也想获取mutex,但是此时被线程1所占用,线程2进入休眠,等待mutex被释放 线程1做完数据处理后,调用pthread_cond_signal唤醒等待队列中线程2。线程1在调用pthread_mutex_unlock前,因为系统调度的原因,线程2获取使用CPU的权利,那么它就想要开始处理数据,但是在开始处理之前,mutex必须被获取,线程1正在使用mutex,所以线程2被迫再次进入休眠 然后就是线程1执行pthread_mutex_unlock后,线程2方能被再次唤醒。 十分低效 * 函数原型 #includepthread.h int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const timespec *timeout); 参数与返回值 cond:条件变量 mutex:互斥量 * 参数和返回值 timeout:超时时间,是一个绝对时间,而非相对时间 struct timespec { time_t tv_sec; //秒数 long tv_nsec; //纳秒 }; * 超时值的设置 * 在默认情况下,pthread_cancel函数会使得线程ID等于tid的线程,如同其调用了参数为PTHREAD_CANCELED的pthread_exit 线程可以选择忽略取消方式或者控制取消方式,将在后面讨论 pthread_cancel并不等待线程终止,它仅仅是提出请求 * 当线程终止时,可以调用自定义的线程清理处理函数,进行资源释放等操作。类似于atexit函数。 线程可以注册多个清理处理函数,这些函数被记录在栈中,它们的执行顺序与它们的注册顺序相反。 线程清理处理函数的注册: #includepthread.h void pthread_cleanup_push(void (*rtn)(void *), void *arg); * 参数 rtn:清理函数,无返回值,一个类型为指针的参数 arg:当清理函数被调用时,arg将传递给清理函数 清理函数被调用的时机 调用pthread_exit时 响应取消请求时 以非0参数调用pthread_cleanup_pop时 * pthread_cleanup_push必须和pthread_cleanup_pop成对出现,而且出现的地方必须在同一个作用域内 函数原型 #includepthread.h void pthread_cleanup_pop(int execute); * 在默认情况下,线程的终止状态会保存到对该线程调用pthread_join; pthread_detach函数可以使线程进入分离状态; 若线程已经处于分离状态,线程的底层存储资源可以在线程终止时立即被收回; 当线程被分离时,并不能用pthread_join函数等待它的终止状态,此时pthread_join返回EINVAL。 * 函数原型 #includepthread.h int pthread_detach(pthread_t tid); 参数与返回值 tid:进入分离状态的线程的ID 成功返回0,出错返回错误编号 * 代码演示 线程同步的概念 互斥量 死锁 读写锁 条件变量 * 为什么需要同步 对同一个存储单元,至少存在两个执行体,其一读该单元,另一写该单元,则需要同步,避免不一致性 在处理器架构中,对内存单元的修改,可能需要多个总线周期,因此读操作和写操作有可能交织在一起 * 假设读操作需要一个总线周期 写操
您可能关注的文档
最近下载
- 《酒店客户关系管理 》课件——项目四 酒店客户关系建立与维护.pptx VIP
- 监控报价清单表-监控报价模板.xlsx VIP
- 1.1 什么是美术作品 课件高中美术湘美版(2019)美术鉴赏.pptx
- 《酒店客户关系管理 》课件——项目二 酒店客户关系管理主体.pptx VIP
- 船舶驾驶员实用英语口语.doc VIP
- 《酒店客户关系管理 》课件——项目一 酒店客户关系管理导论.pptx VIP
- 船舶驾驶员实用英语口语5.docx VIP
- 《酒店客户关系管理 》课件——项目八 酒店客户关系数字化运营.pptx VIP
- 食材配送应急预案处理流程及响应时间.docx VIP
- 保安服务 投标方案(技术标 ).doc
文档评论(0)