https://github.com/wang-bin/threadlocal
portable and implemention configurable c++11 like thread local
https://github.com/wang-bin/threadlocal
Last synced: 12 months ago
JSON representation
portable and implemention configurable c++11 like thread local
- Host: GitHub
- URL: https://github.com/wang-bin/threadlocal
- Owner: wang-bin
- License: mpl-2.0
- Created: 2016-08-07T03:21:16.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2021-07-07T13:06:53.000Z (almost 5 years ago)
- Last Synced: 2025-01-14T09:43:24.765Z (over 1 year ago)
- Language: C++
- Size: 26.4 KB
- Stars: 25
- Watchers: 3
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# ThreadLocal
Portable, implementation configurable and `c++11` thread_local compatible. The same code using macro `THREADL_LOCA(T)` supports different implementations controlled by macro `USE_STD_THREAD_LOCAL`.
The default implementation of macro `THREAD_LOCAL(...)` is c++11 `thread_local` keyword if supported. Otherwise, pthread and FLS implementation is used.
## WHY
- `c++11` **thread_local** is not available for vs2013, macOS<10.10 and iOS, libc++ < 4.0(android ndk < r14), and non-trivial TLS destruction is not supported by MinGW clang.
- std thread_local may have bugs, including mingw and android, see android-ndk/ndk issue 687
## Limitation
Variables declared by `THREAD_LOCAL(T)`(actually only `ThreadLocal`) must have static storage duration, i.e. usually `static` specifier is required.
## Examples
```
// declare and initialize. use THREAD_LOCAL macro to switch between c++11 thread_local keyword and ThreadLocal implementation at build time using -DUSE_STD_THREAD_LOCAL=1/0
static THREAD_LOCAL(int) a;
static THREAD_LOCAL(int) b(1);
static THREAD_LOCAL(int) c = 2;
// assignment
a = 3;
// get address of stored thread data
int* pa = &a;
*pa = 4;
// type convert
printf("a=%d\n", (int&)a);
```
## Tested Compilers
VS>=2013, gcc>=4.7, clang >=3.2, Apple clang, zpacc++1.0, icc>=16
## Build
- `g++/clang++` `c++11` thread_local: `(clan)g++ -std=c++11 test.cpp`
- `g++/clang++` pthread implementation: `(clan)g++ -std=c++11 test.cpp -DUSE_STD_THREAD_LOCAL=0`
- apple clang (pthread implementation): `clang++ -std=c++11 test.cpp`
- vs>=2015 `c++11` thread_local: `cl /EHsc test.cpp`
- vs>=2015 FLS implementation: `cl /EHsc test.cpp -DUSE_STD_THREAD_LOCAL=0`
- vs2013 (FLS implementation): `cl /EHsc test.cpp`
- mingw `c++11` thread_local: `g++ -std=c++11 test.cpp`
- mingw FLS implementation: `g++ -std=c++11 test.cpp -D_WIN32_WINNT=0x0600 -DUSE_STD_THREAD_LOCAL=0`
- mingw pthread implementation: `g++ -std=c++11 test.cpp -DUSE_STD_THREAD_LOCAL=0`