views:

322

answers:

2

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 system to handle multiple threads properly. For each line of trace output, I'd like to print a thread id or a thread name. Threads are instantiated in various ways, e.g. both NSOperationQueue and pthread functions are used.

I've currently a following two alternatives, but I'm not satisfied with either of them. Are there any other options?

pthread_t option

pthread_t seems to be a typedef of a platform specific _opaque_pthread_h. It would be ok to use fields of _opaque_pthread_h for now, even if it's hack-y and not portable. It has a __sig field of type long, but that seems to have a same value for all threads of my process.

NSThread option

[NSThread name] requires NSAutoreleasePool to be in place, but I don't want that to be a requirement as most of our code is pure C++, so it would be nice to just to launch c++ function without autorelease pool wrapping.

+1  A: 

See pthread_getname_np.

Unfortunately NSThread's name is not currently pushed down to that. The NSThread name is just an ivar, so there will be no way to get at it except through the method. You could always make a C function that makes the autorelease pool and gets the name. Your C++ code then doesn't have to be compiled as ObjC++.

pthread_getname_np is probably a bit more useful than NSThread's name right now anyway. gdb and Instruments don't know about NSThread's name, only the pthread level name.

Ken
Superb. I'll try this tomorrow.
tequilatango
Unfortunately, iPhone doesn't have pthread_getname_np, so this doesn't work on iPhone.
tequilatango
+1  A: 

I found a one way that is enough to get some kind of unique identifier for trace output.

pthread_mach_thread_np can be used to get a thread identifier, an unsigned int on iPhone.

mach_port_t tid = pthread_mach_thread_np(pthread_self());

Apparently this is a same thread id that is used in NSLog output.

tequilatango
Works great, thanx!
JOM