【问题标题】:pthread return value errorpthread返回值错误
【发布时间】:2010-10-13 07:09:42
【问题描述】:

我是 Linux 编程新手。

我正在从线程返回一个值。但是在编译时它列出了一些错误。我在下面列出代码和错误。请帮助我了解错误的原因以及如何解决。

代码

#include <pthread.h>
#include <stdio.h>
void* compute_prime (void* arg)
{
        int x = 2;
        return (void*) x;
}


int main ()
{
        pthread_t thread;
        int prime;
        pthread_create (&thread, NULL, &compute_prime, NULL);
        pthread_join (thread, (void*) &prime);
        printf("The returned value is %d.\n", prime);
        return 0;
}

错误

$ g++ -othj pdfex.cpp -lpthread
pdfex.cpp: In function `int main()':
pdfex.cpp:17: error: invalid conversion from `void*' to `void**'
pdfex.cpp:17: error:   initializing argument 2 of `int pthread_join(pthread_t, void**)'

我做错了什么?

【问题讨论】:

  • 尝试重新发布并使用代码段的代码格式化按钮,否则格式化将被关闭。

标签: c++


【解决方案1】:

由于pthread_join()的声明为:

int pthread_join(pthread_t thread, void **value_ptr);

你的 '(void *)' 演员是错误的 - 编译器告诉你。

如何解决?

  • 如果你的机器上有sizeof(void *) == sizeof(int),那么:

    pthread_join(thread, (void **)&prime);
    
  • 否则:

    uintptr_t uip;
    pthread_join(thread, (void **)&uip);
    prime = uip;
    

    这需要#include &lt;stdint.h&gt;(或#include &lt;inttypes.h&gt;),并利用uintptr_tvoid * 大小相同的事实。


此代码在 MacOS X 10.6.4 上为 64 位编译时提供答案 2(对应于“否则”子句):

#include <pthread.h>
#include <stdio.h>
#include <inttypes.h>
#include <assert.h>

static void *compute_prime(void* arg)
{
    uintptr_t x = 2;
    assert(arg == 0);
    return (void *)x;
}

int main(void)
{
    pthread_t thread;
    uintptr_t prime;
    pthread_create(&thread, NULL, &compute_prime, NULL);
    pthread_join(thread, (void **) &prime);
    printf("The returned value is %" PRIuPTR ".\n", prime);
    return 0;
}

【讨论】:

  • 感谢您的回复。它帮助我解决错误
  • @Foo Bah:谢谢,但这是一个失败的事业; Thanseer 最后一次出现是在 2010 年 10 月 15 日。
  • @Jonathan 我不知道您实际上可以看到人们上次登录的时间......必须有一种方法来强制标记这类问题(有很多像这样的搁浅问题)
  • 这不是一个失败的原因。即使这对他没有帮助,但它确实帮助了我。我遇到了这个确切的问题,乔纳森帮助我解决了这个问题。代表++
  • 谢谢。 man7.org/linux/man-pages/man3/pthread_create.3.html 上也有一个很好的例子
【解决方案2】:

pthread_join() 请求void**,而你给它一个void*

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2017-10-17
    • 2015-06-19
    • 2014-01-16
    • 2019-10-13
    相关资源
    最近更新 更多