Is there a way to get any kind of thread identifier of the currently running thread without resorting to Objective-C\'s NSThread.
I\'m improving our custom debug tracing
One disadvantage of using a Mach port name to identify a thread is that the name returned is local to the calling process. If several tasks retrieve a particular task's threads (using task_threads), each task will retrieve a different port name for a particular thread.
On OS X, you can retrieve a unique 64-bit identifier using thread_info. This identifier is global (it is the same for a given thread, no matter which task is querying it) and unique (no other thread will ever have the same ID, now or in the future, until after reboot of course - as a 64-bit value, overflow is unlikely).
(See XNU source, XNU source.)
Retrieve this identifier for a pthread using code along these lines:
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;
}
}
(See XNU source.)
Two notes:
There's no documentation for THREAD_IDENTIFIER_INFO
, or at least none that I've been able to find. So I suppose, strictly speaking, that makes it undocumented. But it's in the public headers, right next to THREAD_BASIC_INFO, which is documented - so I'm assuming this is simply an oversight. It's not like the documentation for any of this stuff is particularly great.)
I don't know what the situation is on iOS, but THREAD_IDENTIFIER_INFO
and pthread_mach_thread_np
both appear to be available in the headers, so it could be worth a try.