2013-12-11 3 views
10

Как проверить, является ли текущий поток основным потоком в linux? Похоже, что gettid() возвращает только pid, но кажется, что linux не гарантирует, что поток с main() всегда имеет const и равномерный pid.Проверьте, является ли текущий поток основным потоком

Причина в том, что у меня происходит автоматическое распараллеливание, и я хочу убедиться, что pthread_create() не вызывается в функции, которая уже запущена в потоке, созданном pthread_create().

+0

Почему бы не написать разумный код, который знает, что происходит. Можете ли вы просто помнить, что вы создали «pthread_create». Это просто логическое значение –

+0

Вы пробовали syscall (SYS_gettid) вместо этого? Не забудьте включить sys/syscall.h – stackmate

ответ

10

Для Linux:

Если getpid() возвращает тот же результат, как gettid() это основной поток.

int i_am_the_main_thread(void) 
{ 
    return getpid() == gettid(); 
} 

От man gettid:

gettid() возвращает идентификатор потока вызывающего абонента (TID). В однопоточном процессе идентификатор потока равен идентификатору процесса (PID, возвращаемому getpid (2)). В многопоточном процессе все потоки имеют одинаковый PID, но каждый из имеет уникальный TID.

От man clone:

группа темы была добавлено в особенности Linux 2.4 для поддержки POSIX Threads понятия набора нитей, которые разделяют один PID. Внутренне этот общий PID представляет собой так называемый идентификатор группы группы (TGID) для группы потоков. Начиная с Linux 2.4, вызовы getpid (2) возвращают TGID вызывающего абонента.

Потоки внутри группы можно отличить по уникальным идентификаторам (TID) идентификаторов потоков ( ). TID нового потока: , доступный как результат функции, возвращаемый вызывающему абоненту clone(), и нить может получить свой собственный TID с использованием gettid (2).

+0

Спасибо! Btw сторона примечание на машине linux я использую gettid() не определено. Я нашел в другом сообщении, который говорит, используя '#include syscall (SYS_gettid);' заменить get gettid(), и теперь он работает! – user2958862

2

Как насчет использования pthread_self()?.

Это возвращает thread_id вызывающей нити. С помощью этой функции вы можете сохранить идентификатор основного потока (когда вы знаете, является основным) и сравнить его позже с другими значениями, возвращаемыми с pthread_self(), чтобы определить, являются ли они основным или другим.

Хотя я считаю разумным иметь хорошо структурированный код. Что-то вроде функций, которые должны быть выполнены в slave потоки и другие функции, которые должны быть выполнены в мастер нить. Это лучший подход к таким проблемам.

+0

Причина в том, что, как я положил в исходное сообщение, я делаю ** автоматическую ** распараллеливание, что означает, что я не могу предположить, как выглядит исходная данная программа, поэтому мне нужно проверить время выполнения, чтобы увидеть, какой поток имеет конкретный pthread_create () может быть включен. – user2958862

+0

Вот почему мне нужно проверить текущий поток, а не идти с более легким направлением написания красиво организованной программы. – user2958862

+0

Это кажется разумным, делает ли 'thread_self()' подходящим вашим потребностям? –

Смежные вопросы