9 ответов:
pthread_self()функция даст идентификатор потока текущего потока.pthread_t pthread_self(void);The
pthread_self()функция возвращает дескриптор Pthread вызывающего потока. Функция pthread_self () не возвращает интегральный поток вызывающего потока. Вы должны использоватьpthread_getthreadid_np()для возврата интегрального идентификатора для потока.Примечание:
pthread_id_np_t tid; tid = pthread_getthreadid_np();значительно быстрее, чем эти звонки, но обеспечивает такое же поведение.
pthread_id_np_t tid; pthread_t self; self = pthread_self(); pthread_getunique_np(&self, &tid);
что? Человек попросил Linux specific и эквивалент getpid(). Не BSD или Apple. Ответ-gettid () и возвращает целочисленный тип. Вам придется вызвать его с помощью syscall (), например:
#include <sys/types.h> #include <sys/syscall.h> .... pid_t x = syscall(__NR_gettid);хотя это не может быть переносимым для систем, отличных от linux, threadid напрямую сопоставим и очень быстро приобретается. Он может быть напечатан (например, для журналов) как обычное целое число.
можно использовать
pthread_self()родитель узнает идентификатор потока после
pthread_create()выполняется успешно, но при выполнении потока, если мы хотим получить доступ к идентификатору потока, мы должны использовать функциюpthread_self().
в системах Linux вы можете получить идентификатор потока таким образом:
#include <sys/types.h> pid_t tid = gettid();на многих платформах, основанных на BSD, этот ответ https://stackoverflow.com/a/21206357/316487 дает непортативный способ.
однако, если вы считаете, что вам нужен идентификатор потока, вы должны знать, работаете ли вы в одном или другом потоке с другим потоком вы контролируете, вы можете найти некоторую полезность в этом подходе
static pthread_t threadA; // On thread A... threadA = pthread_self(); // On thread B... pthread_t threadB = pthread_self(); if (pthread_equal(threadA, threadB)) printf("Thread B is same as thread A.\n"); else printf("Thread B is NOT same as thread A.\n");Если вам просто нужно знать, находитесь ли вы в основном потоке, есть дополнительные способы, задокументированные в ответах на этот вопрос как я могу сказать, является ли pthread_self основным (первым) потоком в этом процессе?.
pid_t tid = syscall(SYS_gettid);Linux предоставляет такой системный вызов, чтобы вы могли получить идентификатор потока.
эта единственная строка дает вам pid, каждый threadid и spid.
printf("before calling pthread_create getpid: %d getpthread_self: %lu tid:%lu\n",getpid(), pthread_self(), syscall(SYS_gettid));
pthread_getthreadid_npне было на моем Mac os x.pthread_tявляется непрозрачным типом. Не бейте себя по голове из-за этого. Просто назначьте егоvoid*и называйте это хорошо. Если вам нужноprintfиспользовать%p.
существует также другой способ получения идентификатора потока. При создании потоков с помощью
int pthread_create(pthread_t * thread, const pthread_attr_t * attr, void * (*start_routine)(void *), void *arg);вызов функции; первый параметр
pthread_t * threadфактически является идентификатором потока (то есть беззнаковым длинным int, определенным в битах/pthreadtypes.ч.) Кроме того, последний аргументvoid *arg- это аргумент, который передается вvoid * (*start_routine)функция, котор нужно продеть нитку.вы можете создать структуру, чтобы передать несколько аргументов и отправить указатель на структуру.
typedef struct thread_info { pthread_t thread; //... } thread_info; //... tinfo = malloc(sizeof(thread_info) * NUMBER_OF_THREADS); //... pthread_create (&tinfo[i].thread, NULL, handler, (void*)&tinfo[i]); //... void *handler(void *targs) { thread_info *tinfo = targs; // here you get the thread id with tinfo->thread }
Comments