поток
Блок, относящийся только к системам Microsoft
Модификатор расширенного класса хранения thread используется для объявления локальной переменной потока.
__declspec( thread ) declarator
Заметки
Локальное хранилище потока (TLS) — это механизм, с помощью которого в каждом потоке многопоточного процесса выделяется хранилище для хранения данных определенного потока. В стандартных многопоточных программах данные совместно используются всеми потоками заданного процесса, в то время как локальное хранилище потока является механизмом предоставления данных для конкретного потока. Полное обсуждение потоков см. в разделе Многопоточность.
Объявления локальных переменных потока должны использовать расширенный синтаксис атрибутов и ключевое слово __declspec с ключевым словом thread. В следующем примере кода показано, как объявлять целочисленную локальную переменную потока и инициализировать её некоторым значением:
__declspec( thread ) int tls_i = 1;
Необходимо соблюдать эти правила при объявлении локальных объектов потока и переменных.
Атрибут thread можно применить только к объявлениям и определениям данных, а также классам, не имеющим функции-члены; thread невозможно использовать с объявлениями и определениями функций.
Использование атрибута thread может помешать отложенной загрузке DLL-импортов**.**
Атрибут thread можно задать только для элементов данных со статической длительностью хранения. К ним относятся глобальные объекты данных (статические и extern), локальные статические объекты и статические данные-члены классов. Невозможно объявить объекты автоматических данных с использованием атрибута thread.
Атрибут thread следует использовать для объявления и определения локального объекта потока независимо от того, выполняются ли объявление и определение в одном файле или в отдельных файлах.
Атрибут thread невозможно использовать в качестве модификатора типа.
С помощью атрибута __declspec(thread) можно создать только экземпляры классов POD. Атрибут thread игнорируется, если объект не объявлен как часть объявления класса. Например:
// declspec_thread.cpp // compile with: /LD __declspec(thread) class X { public: int I; } x; // x is a thread object X y; // y is not a thread object
Поскольку разрешено объявление объектов, использующих атрибут thread, эти два примера семантически эквивалентны.
// declspec_thread_2.cpp // compile with: /LD __declspec( thread ) class B { public: int data; } BObject; // BObject declared thread local. class B2 { public: int data; }; __declspec( thread ) B2 BObject2; // BObject2 declared thread local.
В стандартном языке C разрешена инициализация объекта или переменной с помощью выражения, предусматривающего ссылку на себя, но только для объектов нестатической области памяти. Хотя в C++ обычно разрешена такая динамическая инициализация объекта выражениями с ссылкой на себя, такой тип инициализации не допускается в отношении локальных объектов потока. Пример.
// declspec_thread_3.cpp // compile with: /LD #define Thread __declspec( thread ) int j = j; // Okay in C++; C error Thread int tls_i = sizeof( tls_i ); // Okay in C and C++
Обратите внимание, что выражение sizeof, включающее инициализируемый объект, не является ссылкой на себя и является допустимым как в C, так и в C++.
Завершение блока, относящегося только к системам Microsoft