Linux C 프로그램에서 pthread 라이브러리에서 만든 스레드의 스레드 ID를 인쇄하는 방법은 무엇입니까?
예를 들어 : 우리는 다음과 같은 방법으로 프로세스의 PID를 얻을 수 있습니다.getpid()
답변
pthread_self()
함수는 현재 스레드의 스레드 ID를 제공합니다.
pthread_t pthread_self(void);
이 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 특정 및 getpid ()와 동등한 것을 요청했습니다. BSD 나 Apple이 아닙니다. 대답은 gettid ()이며 정수 유형을 반환합니다. 다음과 같이 syscall ()을 사용하여 호출해야합니다.
#include <sys/types.h>
#include <unistd.h>
#include <sys/syscall.h>
....
pid_t x = syscall(__NR_gettid);
이것은 리눅스가 아닌 시스템에 이식 할 수 없지만 threadid는 직접 비교할 수 있고 획득하기 매우 빠릅니다. 일반 정수처럼 인쇄 할 수 있습니다 (예 : LOG).
답변
다른 답변에서 언급했듯이 pthreads는 통합 스레드 ID를 검색하는 플랫폼 독립적 인 방법을 정의하지 않습니다.
Linux 시스템에서는 다음과 같이 스레드 ID를 얻을 수 있습니다.
#include <sys/types.h>
pid_t tid = gettid();
많은 BSD 기반 플랫폼에서이 답변 https://stackoverflow.com/a/21206357/316487 은 이식 불가능한 방법을 제공합니다.
그러나 스레드 ID가 필요하다고 생각하는 이유가 제어하는 다른 스레드와 동일한 스레드에서 실행 중인지 또는 다른 스레드에서 실행 중인지 알기 위해서라면이 방법에서 몇 가지 유틸리티를 찾을 수 있습니다.
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는 스레드의 ID를 얻을 수 있도록 이러한 시스템 호출을 제공합니다.
답변
당신이 사용할 수있는 pthread_self()
부모 pthread_create()
는가 성공적으로 실행 된 후 스레드 ID를 알게 되지만 스레드를 실행하는 동안 스레드 ID에 액세스하려면 함수를 사용해야합니다 pthread_self()
.
답변
이 한 줄은 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
.