线程竞争问题
Posted 孤~狼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程竞争问题相关的知识,希望对你有一定的参考价值。
前言: 线程之间资源共享,所以不存在通信问题,但是会有很强烈的竞争问题,解决线程之间的竞争问题有以下几种方法:
1.互斥量
功能:保证同一时间只有一个线程可以对共享资源进行操作,但是不保证同步
步骤:
1.1初始化互斥量:(2中方法,,一般常用静态)
动态初始化:
static pthread_mutex_t mm;
prhread_mutex_init(&mm,NULL);
静态初始化:
static pthread_mutex_t mm=PTHREAD_MUTEX_INITIALIZER;
1.2 加/解锁操作
pthread_mutex_lock(&mm);//加锁操作,未获得锁的线程则阻塞等待
pthread_mutex_trylock(&mm)//加锁操作,未获得锁的线程则非0返回,继续执行其他 非竞争任务
pthread_mutex_unlock(&mm)//解锁操作,解锁操作不会出错,即使没有锁也可以解锁
1.3 销毁互斥量(锁)
pthread_mutex_destroy(&mm)//
2.读写锁 :读共享 写独占
功能:有时多个线程需要对同个资源进行读写操作时,可能会数据丢失等问题,如在写的时 候发生了读事件,而读写锁可以有效保证 读共享,写独占,主要用于既有读,又有 写,且读的数量远大于写
注意:每个线程执行完后应该放弃自己的时间片,这样可以解决线程饥饿问题
sched_yield() //放弃cpu调度
步骤:
2.1 初始化读写锁(只能动态初始化)
static pthread_rwlock_t rw;//声明一个全局锁变量
pthread_rwlock_init(&rw,NULL)//初始化锁
2.2 加/解锁
pthread_rwlock_wrlock(&rw); //加一把写锁,若加锁失败则阻塞在此
pthread_rwlock_trywrlock(&rw); //加写锁,若加锁失败则立即返回非0值执行其他工作
pthread_rwlock_rdlock(&rw); //加一把读锁,失败阻塞
pthread_rwlock_tryrdlock(&rw); //加读锁,失败非阻塞
pthread_rwlock_unlock(&rw); //解锁(不分类型且不会失败)
2.3 销毁锁
pthread_rwlock_ destroy(&rw);
3.条件变量
以上是关于线程竞争问题的主要内容,如果未能解决你的问题,请参考以下文章
通过使用 notify 代替 notifyAll 减少线程竞争