2017-01-20 4 views
2

Я знаю, что эта вилка создает новый процесс, но как насчет потока, который выполнялся до вызова fork, также он изменяется (потому что теперь он является частью нового процесса «дочерний процесс», который должен иметь новые потоки?)Изменяется ли идентификатор потока после разветвления нового процесса?

Компиляция и запуск следующего теста C подтверждает, что идентификатор потока остается прежний:

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

Идентификаторы потоков являются * непрозрачными * данными, вы не должны использовать их прямое сравнение. Вместо этого используйте ['pthread_equal'] (http://man7.org/linux/man-pages/man3/pthread_equal.3.html). –

+1

Используйте gettid(), а не непрозрачную структуру pthread_t. – Claudio

+0

Да, я просто сравниваю и печатаю результат сравнения идентификатора потока перед форсированием и в дочернем процессе. – Bionix1441

ответ

4

Если вы читаете the pthread_self manual page вы увидите, что

идентификаторы темы гарантированно быть уникальным только в процессе.

(выделено мной)

Это, конечно, означает, что две очень разные процессы могут иметь резьбу с тем же идентификатором.

Если вы по какой-то причине хотите получить уникальный идентификатор ядра в потоке, вместо этого используйте 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). 

Так как вилка эффективно дублирует процесс, в том числе его описателей объектов ядра, поэтому результат не является неожиданным. (Ядро использует как значение handle, так и pid при поиске объектов)