Android不要使用thread_local定义变量

本来看到Android的ndk都开始用gcc4.8和gcc4.9了,而且gcc4.8.1开始支持全部的c++11的特性,但是Android的run time竟然不支持 thread local storage(TLS),更准确地说,是它没实现。  原来是android的run time没有用gnu的glibc,而是用得Google自己实现的Bionic,很多功能没有实现,留了空接口。 根据维基百科上的说法,Boinic没实现的还不止这个。比glibc而言还不支持的功能还有:

  • 不支持异常处理
  • 无标准模板(这个可以用gnustl或者stlport代替)
  • 不支持宽字符(貌似用处不大,现在主流UTF-8了)
  • 据说它比glibc速度快(也不知道快多少)

目前的解决方案有两个,一个是在TLS的地方排除Android平台,另一个是使用pthread_getspecificpthread_setspecific进行曲线救国。

#if defined(__ANDROID__)
// android 不支持tls
#define THREAD_TLS
#elif defined(__clang__)
#define THREAD_TLS __thread
#elif defined(__cplusplus) && __cplusplus >= 201103L
#define THREAD_TLS thread_local
// VC 2003
#elif defined(_MSC_VER) && (_MSC_VER >= 1300)
#define THREAD_TLS __declspec( thread )
#else
#define THREAD_TLS __thread
#endif

参考链接


OpenMP on Android - TLS workaround
Android NDK undefined reference to ___tls_get_addr

发布者

《Android不要使用thread_local定义变量》上有1条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注