리눅스 c 프로그램에서 pthread의 스레드 ID를 얻는 방법?
리눅스 C 프로그램에서 pthread 라이브러리에서 만든 스레드의 스레드 ID를 인쇄하려면 어떻게 해야 하는가?예를 들어, 예를 들어, 우리가 어떻게 하면 공정의 pid를getpid()
.
뭐? 그 사람은 리눅스에 특정한 것, 즉 getpid()에 해당하는 것을 요구했다.BSD나 애플이 아니다.답은 gettid()이고 적분형을 반환한다.syscall()을 사용하여 다음과 같이 호출해야 한다.
#include <sys/types.h>
#include <unistd.h>
#include <sys/syscall.h>
....
pid_t x = syscall(__NR_gettid);
이것은 비 리눅스 시스템으로는 휴대할 수 없지만, 나사산은 직접 비교할 수 있고 매우 빠르게 획득할 수 있다.일반 정수처럼 (LOG와 같은) 인쇄할 수 있다.
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);
다른 답변에서 언급했듯이, pthreads는 통합 스레드 ID를 검색하는 플랫폼 독립적 방법을 정의하지 않는다.
리눅스 시스템에서는 다음과 같이 스레드 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()
부모가 스레드 ID를 알게 된 후pthread_create()
성공적으로 실행되지만 스레드를 실행하는 동안 스레드 ID에 액세스하려면 함수를 사용해야 함pthread_self()
.
이 하나의 선은 당신에게 pid, 각각의 tradid와 spid를 준다.
printf("before calling pthread_create getpid: %d getpthread_self: %lu tid:%lu\n",getpid(), pthread_self(), syscall(SYS_gettid));
나는 그 질문이 명확하지 않을 뿐만 아니라 대부분의 사람들도 그 차이를 인식하지 못한다고 생각한다.다음 말을 검토하십시오.
는 POSIX ststrop idga 리눅스에서 하지 않다.
gettid()
시 및 POSIX 스레드 ID는 스레딩 구현에 의해 할당 및 유지 관리된다.다음에 의해 반환된 스레드 IDgettid()
커널이 할당한 숫자(프로세스 ID와 유사함)이다.리눅스 NPTL 스레딩 구현에서 각 POSIX 스레드는 고유한 커널 스레드 ID를 가지고 있지만, 일반적으로 애플리케이션은 커널 ID에 대해 알 필요가 없으며(그리고 알고 있는 것에 의존하는 경우 이동하지 않는다).다음에서 발췌함:리눅스 프로그래밍 인터페이스: Linux 및 UNIX 시스템 프로그래밍 핸드북, Michael Kerrisk
IMHO, 예를 들어, 가변 홀딩 숫자를 오름차순으로 정의하는 구조를 통과하는 휴대용 방법은 단 하나뿐입니다.1,2,3...
한 가닥가닥이렇게 함으로써 실의 ID를 추적할 수 있다.그럼에도 불구하고 기능을 사용해야 한다.
if (pthread_equal(tid1, tid2)) printf("Thread 2 is same as thread 1.\n");
else printf("Thread 2 is NOT same as thread 1.\n");
pthread_getthreadid_np
내 맥 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
실제로 스레드 ID(비트/pthreadtypes.h로 정의된 서명되지 않은 긴 int).또한, 마지막 논쟁은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();
당신은 또한 이런 방식으로 쓸 수 있고 그것은 똑같이 한다.예:
for(int i=0;i < total; i++)
{
pthread_join(pth[i],NULL);
cout << "SUM of thread id " << pth[i] << " is " << args[i].sum << endl;
}
이 프로그램은 pthread_t의 배열을 설정하고 각각에 대한 합을 계산한다.그래서 그것은 각 실의 합을 실 ID로 인쇄하고 있다.
참조URL: https://stackoverflow.com/questions/21091000/how-to-get-thread-id-of-a-pthread-in-linux-c-program
'IT이야기' 카테고리의 다른 글
Oracle JDK와 OpenJDK의 차이점 (0) | 2022.04.17 |
---|---|
서로 다른 .c 파일 간에 변수를 공유하려면 어떻게 해야 하는가? (0) | 2022.04.17 |
Vue.createApp이 작동하지 않지만 새 Vue() 방법으로 작동 중임 (0) | 2022.04.17 |
Java 인터페이스의 메서드는 공개 액세스 수정자를 포함하거나 포함하지 않고 선언되어야 하는가? (0) | 2022.04.17 |
Bootstrap-vue 테이블 _ showdetails는 데이터 업데이트 시 닫힘 (0) | 2022.04.17 |