поток

Блок, относящийся только к системам 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

См. также

Ссылки

__declspec

Ключевые слова в C++

Основные понятия

Локальное хранилище потока (TLS)