c++ - 为什么pthread_join()返回0而不是我的线程的返回值?

标签 c++ linux multithreading pthreads

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

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

最佳答案

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;

关于c++ - 为什么pthread_join()返回0而不是我的线程的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61378465/

相关文章:

c++ - 将证书和 png 加载到 char*

linux - Bash脚本被杀死时如何杀死当前命令

html - Linux中的Linkify文本文件

php - 执行 PHP 端锁定时如何选择锁定名称

java - 阻塞线程的调用方法

java - 内存超过给定阈值后暂停所有正在运行的线程

c++ - 指针 vector 而不是对象

c++ - C++11 中引用的使用

c++ - iOS 上的 Qt 蓝牙

linux - "@"符号在 Unix 终端中被解释为换行符