Локальна пам'ять ниток

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Локальна Пам'ять Потоку (англ. 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

Джерела

[ред. | ред. код]
  1. Thread variables (англ.). Архів оригіналу за 31 січня 2022. Процитовано 31 січня 2022. {{cite book}}: Проігноровано |website= (довідка)

Посилання

[ред. | ред. код]