Почему pthread_join () возвращает 0 вместо возвращаемого значения из моего потока? - PullRequest
1 голос
/ 23 апреля 2020

Я пытаюсь создать многопоточную программу, которая будет искать несколько файлов из одного и того же каталога, что и исполняемый файл, построчно для подстроки фразы «Hello World». Каждый файл обрабатывается отдельным потоком.

К сожалению, первый поток возвращает 0 для количества прочитанных шаблонов вместо правильного значения, в то время как все остальные последующие потоки возвращают правильное значение. Внутренне поток будет показывать правильное количество шаблонов, найденных даже для первого потока, который возвращает неправильное значение. Я просто не понимаю, почему он возвращает неправильное значение. Я неправильно понял, как pthread_join() работает?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020
int *threadPatterns;
int a = 0;
threadPatterns = &a;

...

return (void *)threadPatterns;

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

Чтобы исправить его, верните адрес, который будет существовать после окончания потока. Это может быть глобальная переменная или переменная типа c, или указатель, передаваемый из основного потока, или куча памяти, выделенная с помощью malloc(). Если вы сделаете последнее, то основной поток должен free() сделать это, как только это будет сделано.

int *threadPatterns = malloc(sizeof(int));

if (!threadPatterns) {
    // handle allocation failure
}

...

while (...) {
    if(strP) {
        cout << carg << ": " << readLine;
        (*threadPatterns)++;
    }
}

...

return threadPatterns;
1 голос
/ 23 апреля 2020

Вы можете заглянуть в pthread_exit (), чтобы вернуть любое значение из потока. Однако если вы хотите вернуть некоторое значение из pthread.join (), вы можете использовать глобальные переменные. Страница Man для pthread_join

Понимание pthread_exit

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