Локальна пам'ять нитей
Локальна Пам'ять Ниті — це механізм, за допомогою якого в кожній окремій ниті виконання можуть використовуватися власні копії глобальних та статичних змінних.
Це буває корисним у деяких випадках, бо всі ниті розділяють одну і ту ж пам'ять свого процесу. Іншими словами, дані, розміщені в статичних чи глобальних змінних, зазвичай завжди розміщені в одному місці, якщо до них звертаються ниті одного процесу. Однак змінні розташовані у стеку є унікальними для нитей, оскільки кожно з ниж має свій стек, розміщений в окремому блоці пам'яті.
Іноді потрібно, щоб дві ниті, що звертаються до якоїсь глобальної змінної, насправді звертались до різних місць в пам'яті, таким чином роблячи змінну локальною для ниті. Канонічним прикладом є змінна коду помилки errorno мови C.
Зміст |
Варіанти реалізації [ред.]
C/C++ [ред.]
Ключове слово __thread використовується так:
__thread int number;
- __thread визначає number як локальну змінну ниті.
- int визначає тип змінної number як цілочисельний тип int.
GCC [ред.]
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 передбачає прямі конструкції для збереження локальних даних нитей.
Python [ред.]
На Python версій 2.4 чи пізніших клас local з модуля threading може бути використаний для створення локального сховища ниті.
import threading mydata = threading.local() mydata.x = 1
Посилання [ред.]
- ELF Handling For Thread-Local Storage — 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" by Doug Doedens
- "Thread-Local Storage" by Lawrence Crowl
- "Developer's Reference"
- Стаття "It's Not Always Nice To Share" by Walter Bright
|
||||||||||||||||||||||||||||||||
