39 lines
1.6 KiB
Markdown
39 lines
1.6 KiB
Markdown
# JSON_NO_THREAD_LOCAL
|
|
|
|
```
|
|
#define JSON_NO_THREAD_LOCAL
|
|
```
|
|
|
|
When defined, the library does not use `thread_local` storage. This is relevant for the few environments whose toolchain does not support it.
|
|
|
|
The copy constructor copies the first levels of a value by copying the containers, which copy their elements, and completes whatever is nested deeper than that without the call stack, so that copying a value cannot exhaust the stack however deeply it is nested. It counts the levels it has descended into in a `thread_local` variable, as a counter shared between threads would be raced.
|
|
|
|
Without that counter, no descent can be bounded safely, so objects and arrays are copied without the call stack right away. Copying keeps working exactly as it does otherwise - the same values come out, and deeply nested values are copied just as safely - but copying is slower, because the containers no longer copy themselves. Copying the benchmark documents takes 9% (`canada.json`) to 34% (`twitter.json`) longer; values built mostly from objects are affected the most.
|
|
|
|
## Default definition
|
|
|
|
By default, `JSON_NO_THREAD_LOCAL` is not defined.
|
|
|
|
```
|
|
#undef JSON_NO_THREAD_LOCAL
|
|
```
|
|
|
|
The library defines it by itself for Clang targeting MinGW, which does not survive the `thread_local` storage: copying a value segfaults there, with both old and current Clang versions, while GCC targeting MinGW is unaffected.
|
|
|
|
## Examples
|
|
|
|
Example
|
|
|
|
The code below forces the library not to use `thread_local` storage.
|
|
|
|
```
|
|
#define JSON_NO_THREAD_LOCAL 1
|
|
#include <nlohmann/json.hpp>
|
|
|
|
...
|
|
```
|
|
|
|
## Version history
|
|
|
|
- Added in version 3.12.1.
|