pthread_create неопределенная переменная - PullRequest
0 голосов
/ 01 марта 2012

Я пытаюсь создать пять потоков в основной теме.

В функции pthread_create () я передаю возрастающее значение 'num' в качестве переменной для функции 'up' каждый раз, поэтому я подумал, что значение y в каждом потоке должно быть 1,2,3,4 и 5 в случайном порядке соответственно.

Однако, когда printf («перед добавлением num равно% d \ n», y) в функции «up» вызывается, чтобы проверить значение 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 Ответ

3 голосов
/ 01 марта 2012

Проблема в том, что вы передаете один и тот же адрес каждому потоку - каждый поток имеет доступ к одной и той же ячейке памяти (поскольку вы передали &num каждому из них).

Самый дешевый способ исправить это - использовать массив:

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

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

Это должно быть безопасно, так как вы вызываете join в одном и том же потоке (nums не выйдет из области видимости до завершения потоков).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...