浅析Linux中的线程局部存储( 九 )

2. 在常见的存储pthread_setspecific()函数参数value的实现中 , 大多数都类似于下图的实现 。 图中假设pthread_keys[1
分配给func1()函数 , pthread API为每个函数维护指向线程局部存储数据块的一个指针数组 , 其中每个数组元素都与图线程局部数据键的实现(上图)中的全局pthread_keys中元素一一对应 。

五、总结

使用全局变量或者静态变量是导致多线程编程中非线程安全的常见原因 。 在多线程程序中 , 保障非线程安全的常用手段之一是使用互斥锁来做保护 , 这种方法带来了并发性能下降 , 同时也只能有一个线程对数据进行读写 。 如果程序中能避免使用全局变量或静态变量 , 那么这些程序就是线程安全的 , 性能也可以得到很大的提升 。 如果有些数据只能有一个线程可以访问 , 那么这一类数据就可以使用线程局部存储机制来处理 , 虽然使用这种机制会给程序执行效率上带来一定的影响 , 但对于使用锁机制来说 , 这些性能影响将可以忽略 。 更高性能的线程局部存储机制就是使用__thread , 这个以后再讨论 。

推荐阅读