- 4
- 0
- 约 6页
- 2017-08-15 发布于贵州
- 举报
多线程编程-性能
在上一章节中,我们介绍了线程互斥锁的使用。通过互斥锁,使得每个线程只能串行地运行临界区代码,从而有效地避免了多线程冲突。串行的代码运行方式削弱了多线程并发运行的特性,因此线程锁也潜在地降低了程序性能,如何杜绝线程冲突,又尽可能不影响程序效率,是我们每一个线程从员需要认真考虑的事情。
减少线程性能下降的方法有如下几点:
1 尽可能减小互斥锁的颗粒,使串行代码的比例减小从而提高效率,这在上一章节末已提过。
2 加锁解锁之间的代码,运行时间尽可能减少,避免有sleep或死循环一类的超时等待。
3 对不同的冲突资源使用不同的线程锁,避免不相关的线线之间因锁反而产生关联。
4 使用pthread_mutex_trylock代替pthread_lock在检测和处理锁冲突,实现单线程对多个对像的非阻塞处理。
今天我们重点介绍pthread_mutex_trylock的使用,并通过实例的来展现其用法,探究其提高程序效果的原理。
首先,我们来看pthread_lock与pthread_mutex_trylock的函数原型:
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock( pthread_mutex_t *mutex);
可以看到,这两个函数的原型非常想像,功能也比较类似,都是尝试对给定的锁对像进行加锁,如果成功,则线程获得该锁,并返回0;不同点在于当锁已被其他线程占有的情况下,pthread_mutex_lock会阻塞,直至锁被其它线程释放并且本线程获得锁;如pthread_mutex_trylock则不然,如果锁当前已被其他线程占有,则立刻返回失败(非0值),我们的程序可判读返回值并进行下一步的处理(如处理另一个任务),避免线程被阻塞,从而提高了线程并发度,提升程序性能。我们接下来看例子:
#include pthread.h
#include stdio.h
#include unistd.h
typedef struct
{
int m_cnt[3];
pthread_mutex_t m_mutex;
} count_t;
#define COUNT_CNT 20
#define CYC_CNT 10000
count_t g_counts[COUNT_CNT];
void *thread_task1(void *arg)
{
int i;
int cnt = 0;
//保证每个count_t对像的m_cnt[0]值都被累加到指定值CYC_CNT
while (cnt COUNT_CNT)
{
//依次处理每一个count_t对像
for (i = 0; i COUNT_CNT; i++)
{
count_t *c = g_counts + i;
//当cnt成员累加到CYC_CNT值时,不再对其进行处理
if (c-m_cnt[0] = CYC_CNT)
{
if (c-m_cnt[0] == CYC_CNT) cnt++; //标识已处理完一个
continue;
}
//尝试加锁
if (pthread_mutex_trylock(c-m_mutex))
{
//获取锁失败,跳过处理下一个对像
continue;
}
c-m_cnt[0]++;
pthread_mutex_unlock(c-m_mutex);
}
usleep(10);
}
printf(task 1 done.\n);
return NULL;
}
void *thread_task2(void *arg)
{
int i;
int cnt = 0;
//保证每个count_t对像的m_cnt[1]值都被累加到指定值CYC_CNT
while (cnt COUNT_CNT)
{
//依次处理每一个count_t对像
for (i = 0; i COUNT_CNT; i++)
{
count_t *c = g_counts + i;
//当cnt成员累加到CYC_CNT值时,不再对其进行处理
if (c-m_cnt[1] = CYC_CNT)
{
if (c-m_cnt[1] == CYC_CNT) cnt++; //标识已处理完一个
continue;
}
//加锁
pthread_mutex_lock(c-m_mutex);
c-m_cnt[1]++;
pthre
您可能关注的文档
最近下载
- 【MOOC】中国传统艺术——篆刻、书法、水墨画体验与欣赏-哈尔滨工业大学 中国大学慕课MOOC答案.docx VIP
- 中国社会史18.ppt
- 2025年生活会“四个带头”个人对照检查检视材料(含典型案例剖析、违纪行为典型案例解析】2篇文.docx VIP
- 一种夹持式轮毂连续翻转机构.pdf VIP
- 准噶尔盆地东南部石炭系来源原油的发现与勘探意义.docx VIP
- 中学地理教学设计课件.ppt VIP
- 交互系统与设计目标.pptx VIP
- 地理新课标教学设计.pptx VIP
- 退役军人适应性培训课件.pptx VIP
- 2021-2025五年高考数学真题分类汇编 专题19 排列组合与二项式定理5种常见考法归类(全国通用)(解析版).pdf VIP
原创力文档

文档评论(0)