使用pthread_exit()返回retval时编译警告

时间:2012-12-19 09:43:23

标签: c linux pthreads

我有以下内容:

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()

的行

我根本找不到有什么问题:( ...

3 个答案:

答案 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所说。