多线程 – 这是竞争条件吗?

前端之家收集整理的这篇文章主要介绍了多线程 – 这是竞争条件吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
竞争条件的定义:种族条件或种族危险是系统或过程中的缺陷,其中过程的输出或结果意外和关键依赖于其他事件的顺序或时间.

考虑以下伪代码

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()将永远不会完成.我认为大多数人会因为使用条件变量而被称为竞争条件.

猜你在找的Java相关文章