pthread返回值错误

时间:2010-10-13 07:09:42

标签: c++

我是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**)'

我做错了什么?

2 个答案:

答案 0 :(得分:4)

由于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 <stdint.h>(或#include <inttypes.h>),并利用uintptr_tvoid *相同的事实。


此代码在MacOS X 10.6.4(对应于'otherwise'子句)上编译为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;
}

答案 1 :(得分:1)

pthread_join()要求void**,并且您要给它void*