本来看到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_getspecific
,pthread_setspecific
进行曲线救国。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#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
__thread 在 API level 23+ 已經可以支援了喔:):)
https://plus.google.com/+ElliottHughes/posts/3EnRAGURT57