Необходима ли задержка при создании потоков в цикле с использованием pthreads в C? - PullRequest
2 голосов
/ 26 апреля 2019

В настоящее время я пишу простой код на C, используя pthreads.Все, что он делает, это создает 2 потока, и каждый поток складывает половину массива целых чисел, чтобы получить общую сумму массива.Однако по какой-то причине всякий раз, когда я запускаю код без задержки между созданием потока, вторая половина массива добавляется дважды.Добавление минимальной задержки решает проблему, но мне любопытно, почему это происходит.Вот код, который я использую для создания потоков:

for(i = 0; i < THREAD_NUM; ++i){
    args.thread_num = i;
    if(pthread_create(&threads[i], NULL, getSum, (void *)&args) != 0)
      printf("Can't create thread\n");
    //usleep(1);
  }

Числа, которые я добавляю, это числа от 0 до 7, и я ожидаю, что сумма будет 28. Но по какой-то причине, без задержки, ответ44, который является суммой чисел с 4 по 7, добавленных дважды, другими словами, вторая половина массива.С usleep без комментария ответ - 28. Может ли кто-нибудь дать представление о том, что происходит.Спасибо.

1 Ответ

2 голосов
/ 26 апреля 2019

Вы передаете &args вновь созданному потоку, но затем на следующей итерации вы немедленно изменяете его и пытаетесь запустить другой поток. Что если предыдущий поток попытается прочитать thread_num после этой модификации? Это будет читать неправильное значение.

Определенно не добавляйте произвольный сон. Это никогда не правильный способ исправления ошибок с потоками.

Вместо этого, здесь, вы должны прекратить использовать один и тот же args для каждого отдельного потока. Создайте отдельный поток для каждого потока, чтобы они не обменивались данными. Вы не показываете, как вы его распределяете, но это может выглядеть примерно так:

struct args args[THREAD_NUM];

for (i = 0; i < THREAD_NUM; ++i) {
    args[i].thread_num = i;
    if (pthread_create(&threads[i], NULL, getSum, &args[i]) != 0) {
        printf("Can't create thread\n");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...