【问题标题】:C pthread_join return valueC pthread_join 返回值
【发布时间】:2012-10-30 05:10:40
【问题描述】:

我正在尝试从 pthread_join 打印返回值。我有以下代码:

    for(j = 0 ; j < i ; ++j){
        pthread_join( tid[j], returnValue);  /* BLOCK */
        printf("%d\n",  (int)&&returnValue);
}

所有线程都存储在 tid 数组中,并正确创建和返回。在每个线程函数的末尾,我有以下行:

pthread_exit((void *)buf.st_size);

我正在尝试返回我正在阅读的某个文件的大小。出于某种原因,我无法让它打印正确的值。这很可能是我试图从 pthread_join 函数调用中取消引用 void ** 的方式,但我不太确定如何去做。提前感谢您的帮助。

【问题讨论】:

    标签: c return pthreads


    【解决方案1】:

    您需要将void * 变量的地址传递给pthread_join——它将被填充退出值。然后应该将 void * 转换回 pthread_exit 调用最初存储到其中的任何类型:

    for(j = 0 ; j < i ; ++j) {
        void *returnValue;
        pthread_join( tid[j], &returnValue);  /* BLOCK */
        printf("%zd\n",  (size_t)(off_t)returnValue);
    }
    

    【讨论】:

    • 这很有意义,我现在唯一的问题是我在编译它时收到的警告,“警告:从指针转换为不同大小的整数 [-Wpointer-to-int- cast]",除了它可以按我的需要工作。
    • 使用intptr_t而不是int来获得一个与指针大小相同的整数类型。
    • 最后一行应该是printf("%d\n", *(int *)returnValue);
    • @smac89: 不,这可能会崩溃——退出值是一个off_t,它已经被转换为void *,所以你需要把它转换回一个整数类型,而不是尝试取消引用无效指针。
    【解决方案2】:

    这是有效的:

    for(j = 0 ; j < i ; ++j) {
        int returnValue;
        pthread_join( tid[j], (void **)&returnValue);  /* BLOCK */
        printf("%d\n",  returnValue);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-11-04
      • 2021-10-26
      • 2020-08-15
      • 2016-06-02
      • 2020-08-06
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      相关资源
      最近更新 更多