Локальна пам'ять ниток
Локальна Пам'ять Потоку (англ. Thread-local storage) — механізм, за допомогою якого в кожному окремому потоці виконання можуть використовуватися власні копії глобальних та статичних змінних.
Це буває корисним у деяких випадках, бо всі потоки розділяють одну і ту ж пам'ять свого процесу. Іншими словами, дані, розміщені в статичних чи глобальних змінних, зазвичай завжди розміщені в одному місці, якщо до них звертаються потоки одного процесу. Однак змінні розташовані у стеку є унікальними для потоку, оскільки кожний потік має свій стек, розміщений в окремому блоці пам'яті.
Іноді потрібно, щоб два потоки, що звертаються до якоїсь глобальної змінної, насправді звертались до різних місць в пам'яті, таким чином роблячи змінну локальною для потоку. Канонічним прикладом є змінна коду помилки errorno мови C.
Ключове слово __thread використовується так:
__thread int number;
- __thread визначає number як локальну змінну потоку.
- int визначає тип змінної number як цілочисельний тип int.
GCC C/C++ реалізує __thread як показано нижче.
Змінна повинна бути ініціалізована константою на етапі компіляції:
__thread int number = 1;
але не
void f (int number) { static __thread int number_copy = number;
або (C++)
__thread int number = calculate_number();
Бібліотека pthread передбачає прямі конструкції для збереження локальних даних потоку.
У Free Pascal якщо змінна декларується з ключовим словом threadvar
і програма є багатопотоковою, кожен потік виконання отримує свою копію змінної.[1]
На Python версій 2.4 чи пізніших клас local з модуля threading може бути використаний для створення локального сховища потоку.
import threading
mydata = threading.local()
mydata.x = 1
- ↑ Thread variables (англ.). Архів оригіналу за 31 січня 2022. Процитовано 31 січня 2022.
{{cite book}}
: Проігноровано|website=
(довідка)
- ELF Handling For Thread-Local Storage [Архівовано 18 грудня 2008 у Wayback Machine.] — Document about an implementation in C or C++.
- ACE_TSS< TYPE > Class Template Reference
- RWTThreadLocal<Type> Class Template Documentation
- Стаття «Use Thread Local Storage to Pass Thread Specific Data [Архівовано 24 березня 2016 у Wayback Machine.]» by Doug Doedens
- Thread-Local Storage [Архівовано 26 квітня 2021 у Wayback Machine.] by Lawrence Crowl
- Developer's Reference[недоступне посилання з квітня 2019]
- Стаття «It's Not Always Nice To Share [Архівовано 15 липня 2009 у Wayback Machine.]» by Walter Bright