这会导致竞争条件吗?

时间:2015-10-03 19:32:19

标签: multithreading

我在C中创建了一个程序,它将创建10个线程,并在每个线程内添加10,000个整数[0-100]。当线程结束时,它将部分和加到总和中。 2个线程不太可能在同一时间结束,但是如果它们确实会出现问题吗?

#include <stdio.h>
#include <time.h>
#include<pthread.h>

pthread_t pid[10];
int i = 0;
int sum;

void* partial(void *arg)
{
    int partial = 0;
    pthread_t id = pthread_self();

    int k = 0;
    for(k = 0; k < 10000; k++) {
        int r = rand() % 101;
        partial += r;
    }
    sum += partial;
    return NULL;
}

main() {
    srand(time(NULL));
    clock_t begin,end;
    double timeSpent;
    begin = clock();

    while(i < 10) {
        pthread_create(&(pid[i]), NULL, &partial, NULL);
        printf("\n Thread created successfully\n");
        i++;
    }

    sleep(10);
    end = clock();
    timeSpent = (double)(end-begin);
    printf("\n Time taken: %f", timeSpent);
    printf("\n sum: %d \n", sum);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

是的,如果没有与互斥锁锁定,则存在(不太可能但可能)竞争条件的可能性。 如果两个线程同时完成,它们将尝试同时修改公共资源(sum),这将导致公共资源无法正确更新,因为两个线程都将“竞争”读取在sum语句中递增sum+=partial时的值struct vop_getattr_args /* { struct vnode *a_vp; struct vattr *a_vap; kauth_cred_t a_cred; };