首页 > 解决方案 > 为什么 pthread_join() 返回 0 而不是我线程的返回值?

问题描述

我正在尝试创建一个多线程程序,它将逐行从与可执行文件相同的目录中搜索多个文件,以查找短语“Hello World”的子字符串。每个文件由一个单独的线程处理。

不幸的是,第一个线程为读取的模式数量返回 0 而不是正确的值,而所有其他后续线程都返回正确的值。在内部,即使对于返回错误值的第一个线程,线程也会显示找到的正确数量的模式。我只是不明白为什么它返回不正确的值。我误解了pthread_join()工作方式吗?

标签: c++linuxmultithreadingpthreads

解决方案


int *threadPatterns;
int a = 0;
threadPatterns = &a;

...

return (void *)threadPatterns;

&a是一个局部变量的地址,一个在searchfile()返回时被销毁的变量。在线程结束后,该地址不再有效并且访问它会调用未定义的行为。

要修复它,请返回线程结束后将存在的地址。这可能是全局变量或静态变量,也可能是从主线程传入的指针,也可能是使用malloc(). 如果你做最后一个,那么主线程应该在free()它完成后完成它。

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

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

...

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

...

return threadPatterns;

推荐阅读