3

私は次のものを持っています:

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

私は単に何が間違っているのかを見つけることができません:( ...

4

3 に答える 3

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)スレッドに戻り値を割り当てさせます。joins()を実行する他のスレッドは、その値を読み取り、割り当てを解除する必要があります。

void *Thrd(void *vdata) {
    // ...
    int* value = malloc(sizeof *value);
    *value = ...;
    return value;
}
// ...
void* status;
pthread_join(txThread, &status);
int* value = status;
// ...
free(value);
于 2012-12-19T10:11:59.177 に答える
0

非ポインターをポインターにキャストしています-それが警告を受け取っている理由かもしれません。おそらく、コードを変更して のint*代わりにを使用しint ret、それを にキャストできますvoid*

編集:トニー・ザ・ライオンが言及したように。

于 2012-12-19T09:53:12.940 に答える
0

これの代わりに:

pthread_exit((void *)ret);

これを書きます:

pthread_exit((void *)&ret);

「pthread_exit((void *)ret)」では、pthread_exitaddress に戻り値があることを伝えています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そして、ポインターを忘れないでください。

于 2012-12-19T09:47:59.543 に答える