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