3

「pthread_join」の動作をチェックしており、次のコードがあります。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <errno.h>

#include <pthread.h>

void *thread(void *vargp)
{
    pthread_detach(pthread_self());
    pthread_exit((void *)42);
}

int main()
{
    int i = 1;
    pthread_t tid;

    pthread_create(&tid, NULL, thread, NULL);

    sleep(1);
    pthread_join(tid, (void **)&i);
    printf("%d\n", i);
    printf("%d\n", errno);
}

私のプラットフォームで観察された出力 (Linux 3.2.0-32-generic #51-Ubuntu SMP x86_64 GNU/Linux):

  1. 「sleep(1)」をコメントアウトした場合: 42 0

  2. sleep ステートメントを使用すると、以下が生成されます。 1 0

pthread_join の man ページによると、結合できないスレッドに参加しようとするとエラー ' EINVAL ' が発生するはずですが、上記のいずれの場合も errno が設定されていません。また、最初のケースでは、切り離されたスレッドの終了ステータスも取得できるように見えましたが、結果に混乱しています。誰でもこれを説明できますか?ありがとう

[編集]:最初の printf が 'errno' をリセットする可能性があることに気付きましたが、2 つの 'printf' ステートメントの順序を入れ替えた後でも、同じ結果が得られました。

4

2 に答える 2

5

あなたの期待は間違っています。デタッチされたスレッドで呼び出すpthread_joinと、未定義の動作が呼び出されます。errnoを設定したり、エラー コードを返したり、まったく返す必要はありません。

引用が必要な場合は、

pthread_join() のスレッド引数で指定された値が結合可能なスレッドを参照していない場合、動作は未定義です。

ソース: http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_join.html

また、 を含むほとんどの pthread 関数は をpthread_join使用しないことに注意してくださいerrno。代わりに、戻り値としてエラー コードを返します。そのため、errno呼び出し時に未定義の動作を呼び出さなくても、pthread 関数を呼び出した後に調べることは間違っています。

于 2012-12-17T17:10:51.943 に答える
0

function の戻り値を読み取ると、このエラーが発生します。これpthread_joinを試してください。

if (errno = pthread_join(tid,NULL)) {
    printf("An error ocurred: %i", errno);
}
于 2012-12-17T16:39:48.440 に答える