线程竞争问题

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.条件变量  

以上是关于线程竞争问题的主要内容,如果未能解决你的问题,请参考以下文章

Java代码竞争条件多线程?

跨线程合并更改时如何防止竞争条件?

学习互斥锁和线程 - 关于竞争条件的问题

通过使用 notify 代替 notifyAll 减少线程竞争

HttpApplicationState - 如果它是线程安全的,为啥存在竞争条件?

如何使此 Java 代码正常运行? [多线程,竞争条件]