
Am Saturday 09 January 2010 13:58:35 schrieb Andrey Semashev:
The pointer to the thread-specific data is stored in TLS, last time I checked. And there's no difference in terms of performance in how you store the pointer - via __thread specifier or by manually calling pthread APIs. In case of __thread the compiler will generate the necessary calls to pthread for you, that all you win, AFAIU.
how do you come to that conclusion? << __thread int *ptr; int *get_current_thread_data(){ return ptr; }
<< _Z23get_current_thread_datav: .LFB2: pushl %ebp .LCFI0: movl %gs:ptr@NTPOFF, %eax movl %esp, %ebp .LCFI1: popl %ebp ret
boost's find_tss_data on the other hand: (kcachegrind doesn't let me copy that table, so here is a hand-typed copy of the most important calls) find_tss_data inkl. - exkl. - function 77% - 10% - get_current_thread_data 50% - 15% - boost::call_once 33% - 13% - get_once_per_thread_epoch 31% - 28% - pthread_getspecific
that would speed up thread_specific_ptr::get() 5-fold according to my profiling.
Hmm, that's unexpected. Could you post a patch to test with?
I don't have a patch, it was an estimation based on the profile above.