2017-01-20 8 views
2

私はこのフォークが新しいプロセスを作成することを知っていますが、フォークを呼び出す前に実行していたスレッドについては、それも変更されますか?(新しいスレッドの新しいプロセス "子プロセス"スレッドIDは新しいプロセスをフォークした後に変更されますか?

コンパイルし、次のCのテストを実行するには、スレッドIDが同じままであることを確認:

pthread_t threadId1, threadId2; 

    threadId1 = pthread_self(); 
    if (fork() == 0) 
    { 
    threadId2 = pthread_self(); 
    if (pthread_equal(threadId1,threadId2)) // edited 
    { 
     printf("we are in the same thread \n"); 
    } 
    else 
    { 
    printf("we are on different threads \n"); 
    } 

スレッドが親と子プロセスの間で共有されている理由誰かが私に説明してもらえますか?

+4

スレッドIDは*不透明な*データなので、それらの直接比較は使用しないでください。代わりに['pthread_equal'](http://man7.org/linux/man-pages/man3/pthread_equal.3.html)を使用してください。 –

+1

不透明なpthread_t構造体ではなく、gettid()を使用します。 – Claudio

+0

はい、私は単に、フォーク前のスレッドIDと子プロセスの比較結果を比較して出力します。 – Bionix1441

答えて

4

あなたがthe pthread_self manual pageを読めば、あなたは

スレッドIDは、プロセス内でのみユニークであることが保証されていることがわかります。

(強調鉱山)

もちろん、2つの非常に異なるプロセスが同じIDを持つスレッドを有していてもよいことを意味します。

何らかの理由でスレッドの一意のカーネルIDを取得したい場合は、代わりにgetidを使用してください。

+0

私はそれを逃したありがとうございました。 – Bionix1441

3

pthread_self

Thread IDs are guaranteed to be unique only within a process. A 
    thread ID may be reused after a terminated thread has been joined, or 
    a detached thread has terminated. 

    The thread ID returned by pthread_self() is not the same thing as the 
    kernel thread ID returned by a call to gettid(2). 

のマニュアルページからフォークが効果的にオブジェクトをカーネルにそのハンドルを含むプロセスを複製するので、結果は、したがって、予想外ではありません。 (カーネルは、オブジェクトルックアップを実行するときにハンドル値とpidの両方を使用します)

関連する問題