pthread_create未确定的变量

时间:2012-03-01 06:34:01

标签: c pthreads

我正在尝试在主线程中创建五个线程。

在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);
  }
}

1 个答案:

答案 0 :(得分:3)

问题是你将相同的地址传递给每个线程 - 每个线程都可以访问相同的内存位置(因为你将&num传递给了每个线程。)

你可以解决的最便宜的方法是使用数组:

int nums[] = {1, 2, 3, 4, 5};
/* ... */

pthread_create(&t[i], NULL, up, &nums[i]);

这应该是安全的,因为你在同一个线程中调用join(nums在线程完成之前不会超出范围)。