c++ - 为什么 pthread_join() 返回 0 而不是我线程的返回值?
问题描述
我正在尝试创建一个多线程程序,它将逐行从与可执行文件相同的目录中搜索多个文件,以查找短语“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;
推荐阅读
- angular - 找不到管道“货币”(AOT)
- c# - AutoMapper 没有从 DataTable 返回数据
- c# - C# VS2017 Community - 如何自动压缩项目的输出文件夹
- youtube - 如何从我的 roku 频道打开我的“Youtube 频道链接”?
- java - Java:存储对静态类的引用是可变的
- reactjs - 为材质 ui 中的对话框提供最小尺寸
- html - 从背景图像下方过渡文本
- javascript - 为什么这个函数会影响 JS 范围之外的非全局变量?
- excel - VBA宏:根据条件选择工作表并删除行
- laravel - Laravel 形式在 foreach 循环中被剥离