【问题标题】:Why is pthread_join() returning 0 instead of the return value from my thread?为什么 pthread_join() 返回 0 而不是我线程的返回值?
【发布时间】:2020-08-06 06:16:19
【问题描述】:

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

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

【问题讨论】:

    标签: c++ linux multithreading pthreads


    【解决方案1】:

    您可以查看 pthread_exit() 以从线程返回任何值。 但是,如果你想从 pthread.join() 返回一些值,你可以使用全局变量。 Man Page for pthread_join

    Understanding pthread_exit

    【讨论】:

    • 传递给pthread_create的函数的返回值一般来说已经足够好了。在这两种情况下,它都应该是指向生命周期超出函数范围的对象的指针,但pthread_exit 类似于使用exit 退出程序,使用该代码的读者和程序员不会在大多数情况下都希望如此。
    • 人们也可以通过return从线程函数中返回一个值,就像 OP 实际上所做的那样。 pthread_exit() 提供的主要功能是能够从线程函数调用的其他函数中终止线程。无论采用哪种方式终止线程,提供的void * 值都可以从相应的pthread_join() 调用中获得。全局变量通常是一个糟糕的选择,但在多线程程序中尤其糟糕。
    【解决方案2】:
    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;
    

    【讨论】:

      猜你喜欢
      • 2020-08-15
      • 1970-01-01
      • 2015-06-21
      • 2021-11-16
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      相关资源
      最近更新 更多