「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):
「sleep(1)」をコメントアウトした場合: 42 0
sleep ステートメントを使用すると、以下が生成されます。 1 0
pthread_join の man ページによると、結合できないスレッドに参加しようとするとエラー ' EINVAL ' が発生するはずですが、上記のいずれの場合も errno が設定されていません。また、最初のケースでは、切り離されたスレッドの終了ステータスも取得できるように見えましたが、結果に混乱しています。誰でもこれを説明できますか?ありがとう
[編集]:最初の printf が 'errno' をリセットする可能性があることに気付きましたが、2 つの 'printf' ステートメントの順序を入れ替えた後でも、同じ結果が得られました。