2009-10-08 1 views
13

Objective-C의 NSThread를 사용하지 않고 현재 실행중인 스레드의 모든 종류의 스레드 식별자를 얻을 수있는 방법이 있습니까?Mac/iPhone : Objective-C를 사용하지 않고 스레드 식별자를 얻을 수있는 방법이 있습니까?

여러 스레드를 올바르게 처리하기 위해 사용자 정의 디버그 추적 시스템을 개선하고 있습니다. 추적 출력의 각 행마다 스레드 ID 또는 스레드 이름을 인쇄하고 싶습니다. 스레드는 다양한 방법으로 인스턴스화됩니다 (예 : NSOperationQueue와 pthread 함수가 모두 사용됩니다.

저는 현재 다음과 같은 두 가지 대안을 가지고 있습니다. 그러나 나는 그 중 하나에 만족하지 않습니다. 다른 옵션이 있습니까?

pthread_t

가 pthread_t 옵션은 _opaque_pthread_h 특정 플랫폼의 형식 정의 될 것으로 보인다. hack-y이고 이식성이 아니더라도 _opaque_pthread_h 필드를 사용하는 것이 좋습니다. 그것은 유형의 길이가 __sig 필드를 가지고 있지만 내 프로세스의 모든 스레드에 대해 동일한 값을 갖고있는 것 같습니다.

NSThread 옵션

[NSThread name] 장소에있을 NSAutoreleasePool이 필요하지만, 나는 우리의 대부분의 코드는 순수 C++에서와 같이 그냥 C를 시작하는 것이 좋을 것이다 그래서이 요구되고 싶지 않아 ++ autorelease 풀 랩핑 기능이 없습니다.

답변

22

추적 출력에 대해 일종의 고유 식별자를 얻기에 충분한 한 가지 방법을 찾았습니다.

pthread_mach_thread_np은 iPhone에서 부호없는 int 인 스레드 식별자를 가져 오는 데 사용할 수 있습니다.

mach_port_t tid = pthread_mach_thread_np(pthread_self()); 

분명히 이것은 NSLog 출력에 사용되는 동일한 스레드 ID입니다.

+0

잘 작동합니다. 고맙습니다. – JOM

+0

아, 이것은 이전에 사용했던 방법보다 훨씬 낫습니다 - 스레드의 NSDictionary에서 값을 설정하고 검색합니다. 감사! (OSX 10.4 지원) – Marc

+1

'pthread_mach_thread_np'는'pthread_self'와 같은 한계를 겪지 않습니까? 즉,'thread_id' 재사용은 더 자주 기대/요구됩니까? – jww

1

pthread_getname_np을 참조하십시오.

불행히도 NSThread의 이름은 현재 그 이름으로 푸시되지 않습니다. NSThread 이름은 단지 ivar이므로 메서드를 통하는 경우를 제외하고는 얻을 수있는 방법이 없습니다. autorelease 풀을 만들고 이름을 얻는 C 함수를 만들 수 있습니다. 따라서 C++ 코드는 ObjC++로 컴파일 할 필요가 없습니다.

pthread_getname_np은 아마도 어쨌든 NSThread의 이름보다 더 유용 할 것입니다. gdb와 Instruments는 NSThread의 이름을 알지 못하며 pthread 레벨 이름 만 알지 못합니다.

+0

최고. 나는 내일 이것을 시도 할 것이다. –

+1

아쉽게도 iPhone에는 pthread_getname_np가 없으므로 iPhone에서는 작동하지 않습니다. –

0

마하 포트 이름을 사용하여 스레드를 식별하는 단점은 반환 된 이름이 호출 프로세스에 국한된다는 것입니다. 여러 작업이 특정 작업의 스레드 (사용)를 검색하는 경우 각 작업은 특정 스레드에 대해 다른 포트 이름을 검색합니다.

OS X에서는 thread_info을 사용하여 고유 한 64 비트 식별자를 검색 할 수 있습니다. 이 식별자는 어떤 스레드가 쿼리를 수행하든 상관없이 전역 적이기 때문에 (특정 스레드에 대해 동일합니다.) 고유 한 ID입니다 (물론 재부팅 후 64 자까지 다른 ID는 현재 또는 미래에 동일한 ID를 갖지 않습니다) 비트 값, 오버플로 가능성은 낮습니다).

(XNU source, XNU source 참조).)

는이 라인을 따라 코드를 사용하여 pthread에 대한이 식별자를 검색합니다.

uint64_t GetThreadID(pthread_t thread) { 
    mach_port_name_t port=pthread_mach_thread_np(thread); 

    thread_identifier_info_data_t info; 
    mach_msg_type_number_t info_count=THREAD_IDENTIFIER_INFO_COUNT; 
    kern_return_t kr=thread_info(thread, 
           THREAD_IDENTIFIER_INFO, 
           (thread_info_t)&info, 
           &info_count); 
    if(kr!=KERN_SUCCESS) { 
     /* you can get a description of the error by calling 
     * mach_error_string(kr) 
     */ 
     return 0; 
    } else { 
     return info.thread_id; 
    } 
} 

(XNU source 참조)

두 노트 :

  1. THREAD_IDENTIFIER_INFO에 대한 문서가 없습니다

    , 또는 적어도 내가 발견 할 수 있었던 것은 아무것도 없다. 엄밀히 말하면, 그것이 문서화되지 않았다고 생각합니다. 하지만 공개 머리글에있는 바로 THREAD_BASIC_INFO 옆에있는 입니다. 그래서 나는 이것이 단순히 감시라고 가정합니다. 이 물건의 특히 대단한 것은 모두 헤더에서 사용할 수있는 것으로 보인다).

  2. 나는 상황이 아이폰 OS가 뭔지 모르는

    하지만 THREAD_IDENTIFIER_INFOpthread_mach_thread_np을 문서를 좋아하지, 그래서 그것은 가치가 될 수있다 시도.

관련 문제