竞态条件和临界区

Posted Alex

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了竞态条件和临界区相关的知识,希望对你有一定的参考价值。

1. 临界区和竞态条件:

临界区:访问和操作共享数据的代码段;

竞态条件:当有多个线程同时进入临界区时,执行结果取决于线程的执行顺序;

如下述代码,当多个线程同时调用func函数,对共享数据sum进行操作,实际上我们得到的结果则依赖于执行的相对时间;

线程1在a.取出sum值,然后b.对sum+1,然后c.写入sum值,假设线程2在线程1a步骤之后同样取出sum值,并分别进行+1计算,写回sum值,可见,线程1和线程2计算的结果都是1,此时sum值为1;假设线程2在线程1写回数据之后,取出sum值,进行+1,写回操作,此时sum值为2;可见,线程的执行相对时间不同,导致了共享资源出现了不同结果;

int sum = 0;

...

void func ()
{
  sum++;
}

...

 

2. 保护临界区:

为了保护临界区,我们可使用互斥量、读写锁等同步措施,保证同一时间只有一个线程能够进入到临界区,或者同一时间只有一个写线程进入到临界区,从而避免产生竞态条件;

int sum = 0;

...

void func ()
{
  lock();
  sum++;
  unlock();
}

...

 

以上是关于竞态条件和临界区的主要内容,如果未能解决你的问题,请参考以下文章

java并发 day02 临界区和竞态条件synchronized线程安全 对象头 Monitor管程 wait notifypark&unpark ReentrantLock

java并发 day02 临界区和竞态条件synchronized线程安全 对象头 Monitor管程 wait notifypark&unpark ReentrantLock

java并发 day02 临界区和竞态条件synchronized线程安全 对象头 Monitor管程 wait notifypark&unpark ReentrantLock

JUC并发编程 -- 避免临界区的竞态条件之synchronized 解决方案(同步代码块)

线程同步之临界区

多线程小结