本来看到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
进行曲线救国。
参考链接
OpenMP on Android - TLS workaround
Android NDK undefined reference to ___tls_get_addr
__thread 在 API level 23+ 已經可以支援了喔:):)
https://plus.google.com/+ElliottHughes/posts/3EnRAGURT57