跟我学linux编程-13-多线程编程-性能

跟我学linux编程-13-多线程编程-性能

ID:34499681

大小:47.00 KB

页数:6页

时间:2019-03-07

跟我学linux编程-13-多线程编程-性能_第1页
跟我学linux编程-13-多线程编程-性能_第2页
跟我学linux编程-13-多线程编程-性能_第3页
跟我学linux编程-13-多线程编程-性能_第4页
跟我学linux编程-13-多线程编程-性能_第5页
资源描述:

《跟我学linux编程-13-多线程编程-性能》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、多线程编程-性能在上一章节中,我们介绍了线程互斥锁的使用。通过互斥锁,使得每个线程只能串行地运行临界区代码,从而有效地避免了多线程冲突。串行的代码运行方式削弱了多线程并发运行的特性,因此线程锁也潜在地降低了程序性能,如何杜绝线程冲突,又尽可能不影响程序效率,是我们每一个线程从员需要认真考虑的事情。减少线程性能下降的方法有如下几点:1尽可能减小互斥锁的颗粒,使串行代码的比例减小从而提高效率,这在上一章节末已提过。2加锁解锁之间的代码,运行时间尽可能减少,避免有sleep或死循环一类的超时等待。3对不

2、同的冲突资源使用不同的线程锁,避免不相关的线线之间因锁反而产生关联。4使用pthread_mutex_trylock代替pthread_lock在检测和处理锁冲突,实现单线程对多个对像的非阻塞处理。今天我们重点介绍pthread_mutex_trylock的使用,并通过实例的来展现其用法,探究其提高程序效果的原理。首先,我们来看pthread_lock与pthread_mutex_trylock的函数原型:intpthread_mutex_lock(pthread_mutex_t*mutex);i

3、ntpthread_mutex_trylock(pthread_mutex_t*mutex);可以看到,这两个函数的原型非常想像,功能也比较类似,都是尝试对给定的锁对像进行加锁,如果成功,则线程获得该锁,并返回0;不同点在于当锁已被其他线程占有的情况下,pthread_mutex_lock会阻塞,直至锁被其它线程释放并且本线程获得锁;如pthread_mutex_trylock则不然,如果锁当前已被其他线程占有,则立刻返回失败(非0值),我们的程序可判读返回值并进行下一步的处理(如处理另一个任务)

4、,避免线程被阻塞,从而提高了线程并发度,提升程序性能。我们接下来看例子:#include#include#includetypedefstruct{intm_cnt[3];pthread_mutex_tm_mutex;}count_t;#defineCOUNT_CNT20#defineCYC_CNT10000count_tg_counts[COUNT_CNT];void*thread_task1(void*arg){inti;intcnt

5、=0;//保证每个count_t对像的m_cnt[0]值都被累加到指定值CYC_CNTwhile(cntm_cnt[0]>=CYC_CNT){if(c->m_cnt[0]==CYC_CNT)cnt++;//标识已处理完一个continue;}//尝试加锁if(pthread_mu

6、tex_trylock(&c->m_mutex)){//获取锁失败,跳过处理下一个对像continue;}c->m_cnt[0]++;pthread_mutex_unlock(&c->m_mutex);}usleep(10);}printf("task1done.");returnNULL;}void*thread_task2(void*arg){inti;intcnt=0;//保证每个count_t对像的m_cnt[1]值都被累加到指定值CYC_CNTwhile(cnt

7、{//依次处理每一个count_t对像for(i=0;im_cnt[1]>=CYC_CNT){if(c->m_cnt[1]==CYC_CNT)cnt++;//标识已处理完一个continue;}//加锁pthread_mutex_lock(&c->m_mutex);c->m_cnt[1]++;pthread_mutex_unlock(&c->m_mutex

8、);}usleep(10);}printf("task2done.");returnNULL;}voidcount_proc(count_t*c){//模拟一个比较消耗时间的处理操作c->m_cnt[2]=c->m_cnt[0]*c->m_cnt[1];usleep(1000);}voidmain_thread_task(){inti;intcnt=0;while(cnt++<100){for(i=0;i

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

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

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