竞争条件的定义:种族条件或种族危险是系统或过程中的缺陷,其中过程的输出或结果意外和关键依赖于其他事件的顺序或时间.
考虑以下伪代码:
Global variable i initialized to 6; Thread 1: acquire(lock l) increment global variable i,i.e. i++; Thread 2: acquire(lock l) double the value of global var i,i.e.: i*=2;
如果T1首先获得锁定l并且T2秒,则i的值将为14.另一方面,如果T2首先获取锁定l并且T1获得第i个值,则i的值将为13.
那么这是不是竞争条件呢?
更新:经过多次意见和回答,意见仍然分歧.我的意见是在“是的,这是种族条件”类别.其实我把这个例子作为一个种族条件的情况,在另一个问题上.
同时,我也在“不,不是竞赛条件”类别中阅读一些有趣的评论.
我想我会根据观察这个问题的角度/层次来确定和定论这是或不是竞争条件.
不过,我还在等待有趣的答案/评论.
解决方法
我认为示例算法是否具有竞争条件取决于算法预期做什么.
对于i的修改没有数据竞争 – 这些访问被序列化并且相对于彼此原子地发生.
然而,如果算法的正确性对增量在乘法(或反之亦然)之前发生)的正确性是重要的,则存在竞争,并且必须使用其他手段来同步算法的执行.如果算法是一个复杂的方法来计算i * 2 1(可能是使用线程执行计算可笑),那么就有一个竞争条件.
请考虑以下程序代码段:
int data; pthread_cond_t condvar = PTHREAD_COND_INITIALIZER; pthread_mutex_t mux = PTHREAD_MUTEX_INITIALIZER; void* wait_for_data(void*) { pthread_mutex_lock( &mux); pthread_cond_wait( &condvar,&mux); puts("got the data: %d\n",data); pthread_mutex_unlock( &mux); return 0; } void* set_data(void*) { pthread_mutex_lock( &mux); data = 42; pthread_cond_signal( &condvar); pthread_mutex_unlock( &mux); return 0; }
两个线程本质上完全相互排斥 – 没有数据竞争.但是,如果set_data()在wait_for_data()等待之前发送条件变量,wait_for_data()将永远不会完成.我认为大多数人会因为使用条件变量而被称为竞争条件.