本来看到Android的ndk都开始用gcc4.8和gcc4.9了,而且gcc4.8.1开始支持全部的c++11的特性,我就很happy地用上了。结果出现这么个错误。
网上查到说是Android的run time竟然不支持 thread local storage(TLS),更准确地说,是它没实现。
而我这里需要用TLS来做内存通道无锁队列的数据统计(还好去掉以后只是统计不准)
再查文档下来,原来是android的run time没有用gnu的glibc,而是用得Google自己实现的Bionic,这货很多功能没有实现,留了空接口。
根据维基百科上的说法,Boinic没实现的还不止这个。比glibc而言还不支持的功能还有:
目前的解决方案比较暴力不完美,就是在TLS的地方排除Android平台
#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
具体见: https://github.com/owent-utils/c-cpp/blob/master/include/std/thread.h