我正在尝试创建一个多线程程序,该程序将逐行从可执行文件所在的目录中搜索多个文件,以查找短语“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/