我正在尝试在主线程中创建五个线程。
在pthread_create()函数中,我每次都将增加'num'值作为变量传递给'up'函数,所以我认为每个线程中y的值应该是1,2,3,4和5分别以随机顺序。
但是,当调用函数'up'中的printf(“添加num之前为%d \ n”,y之前)调用y的值时,它表示y可能未确定,这意味着y可能是任何数字介于1到5之间。
如何修复此并行输入问题...提前感谢您的帮助!
const int TOTAL_RUNS = 1000000;
void *up(void *ptr) {
int i;
int y = *((int*)ptr);
printf("before add num is %d\n", y);
for (i = 0; i < TOTAL_RUNS; i++)
y++;
printf("Finished adding 1 a total of %d times.\n", TOTAL_RUNS);
}
void main() {
int num = 1;
pthread_t t[5];
int i;
for (i = 0; i < 5; i++) {
pthread_create(&t[i], NULL, up,(void*) &num);
num++;
}
for (i = 0; i < 5; i++) {
pthread_join(t[i], NULL);
}
}
答案 0 :(得分:3)
问题是你将相同的地址传递给每个线程 - 每个线程都可以访问相同的内存位置(因为你将&num
传递给了每个线程。)
你可以解决的最便宜的方法是使用数组:
int nums[] = {1, 2, 3, 4, 5};
/* ... */
pthread_create(&t[i], NULL, up, &nums[i]);
这应该是安全的,因为你在同一个线程中调用join(nums
在线程完成之前不会超出范围)。