我有以下内容:
void *Thrd(void *data)
{
int ret;
ret = myfunc();
pthread_exit((void *)ret);
}
int main(int argc, char *argv[])
{
int status;
pthread_create(&Thread, NULL, Thrd, &data);
pthread_join(txThread, (void **)&status);
if (status)
printf("*** thread failed with error %d\n", status);
}
它有效并且我能够读取状态但是我在编译时收到以下警告:
test.cpp: In function ‘void* Thrd(void*)’:
test.cpp:468:26: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
这是pthread_exit()
我根本找不到有什么问题:( ...
答案 0 :(得分:3)
因此,您试图从线程函数返回一个整数值。 POSIX线程函数只能返回void*
。
有几种方法可以从另一个线程返回一个值:
1)您可以将整数转换为void*
并返回,前提是void*
的宽度足以容纳值而不会截断:
void *Thrd(void *vdata) {
int value = ...;
void* thread_return_value = (void*)value;
return thread_return_value;
}
// ...
void* status;
pthread_join(txThread, &status);
int value = (int)status;
2)将返回值的地址传递给线程函数,并使线程函数设置为值:
struct Data { int return_value; };
void *Thrd(void *vdata) {
// ...
int value = ...;
struct Data* data = vdata;
data->return_value = value;
return NULL;
}
// ...
pthread_create(&Thread, NULL, Thrd, &data);
pthread_join(txThread, NULL);
int value = data->return_value;
3)让线程分配返回值。 join()的另一个线程需要读取该值并释放它:
void *Thrd(void *vdata) {
// ...
int* value = malloc(sizeof *value);
*value = ...;
return value;
}
// ...
void* status;
pthread_join(txThread, &status);
int* value = status;
// ...
free(value);
答案 1 :(得分:0)
而不是:
pthread_exit((void *)ret);
写下这个:
pthread_exit((void *)&ret);
在“pthread_exit((void *)ret)”中,您告诉pthread_exit
地址pertaining to the value contained in ret variable
处有返回值。您希望结果存储在ret的地址中,因此它应该是pthread_exit(&ret)
。
现在ret
是一个局部整数变量。如果你写的话,它更可取:
int *ret=malloc(sizeof(int));
if(ret==NULL)
//handle the error
*ret=func();
pthread_exit(ret);
不要忘记free
指针。
答案 2 :(得分:0)
您正在向指针投射非指针 - 这可能就是您收到警告的原因。
也许您可以修改代码以使用int*
代替int ret
,并将其转换为void*
。
编辑:正如Tony The Lion所说。