我是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**)'
我做错了什么?
答案 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_t
与void *
相同的事实。
此代码在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*
。