как получить идентификатор потока pthread в программе linux c?



в программе linux c, Как распечатать идентификатор потока потока, созданного библиотекой pthread?

например: мы можем получить pid процесса по getpid()

903   9  

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
}

независимый от платформы способ (начиная с c++11):

#include <thread>

std::this_thread::get_id();

Comments

    Ничего не найдено.