Compartilhar via


thread

Específicos do Microsoft

O segmento o modificador de classe de armazenamento estendido é usado para declarar uma variável de local de thread.

__declspec( thread ) declarator

Comentários

Armazenamento Local do thread (TLS) é o mecanismo pelo qual cada thread em um processo multissegmentado aloca o armazenamento de dados específicos de segmento.Em programas multithread padrão, os dados são compartilhados entre todos os threads de um determinado processo, enquanto o armazenamento local de segmento é o mecanismo para alocar os dados por thread.Para obter uma discussão completa de threads, consulte Multithreading.

Declarações de variáveis locais do segmento devem usar sintaxe de atributo estendido e o __declspec palavra-chave com o segmento palavra-chave.Por exemplo, o código a seguir declara uma variável de local de thread inteiro e o inicializa com um valor:

__declspec( thread ) int tls_i = 1;

Você deve observar essas diretrizes ao declarar variáveis e objetos de thread local:

  • Você pode aplicar o segmento de atributo apenas às declarações de dados e definições e classes que não têm funções de membro; thread não podem ser usados em declarações de função ou definições.

  • O uso da segmento atributo pode interferir com carregamento com atraso da DLL importa**.**

  • Você pode especificar o segmento atributo apenas nos itens de dados, com duração de armazenamento estático.Isso inclui os objetos de dados globais (ambos estático e extern), objetos estáticos locais e membros de dados estáticos de classes.Você não pode declarar os objetos de dados automática com o segmento atributo.

  • Você deve usar o segmento de atributo para a declaração e a definição de um objeto de segmento local, se a declaração e definição de ocorrerem no mesmo arquivo ou arquivos separados.

  • Não é possível usar o segmento atributo como um modificador do tipo.

  • Somente classes POD podem ser instanciadas usando __declspec(thread).O atributo de segmento será ignorado se nenhum objeto for declarado como parte da declaração da classe.Por exemplo:

    // 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
    
  • Como a declaração de objetos que usam o segmento atributo é permitido, estes dois exemplos são semanticamente equivalentes:

    // 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 padrão permite a inicialização de um objeto ou variável com uma expressão que envolvem uma referência a mesma, mas somente para objetos de extensão não estático.Embora o C++ normalmente permite a tal inicialização dinâmica de um objeto com uma expressão que envolvem uma referência a mesma, esse tipo de inicialização não é permitido com objetos de segmento local.Por exemplo:

    // 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++
    

    Observe que uma sizeof expressão que inclui o objeto sendo inicializado não constitui uma referência a mesmo e é permitida em c e C++.

Específicos do Microsoft final

Consulte também

Referência

__declspec

Palavras-chave C++

Conceitos

Armazenamento Local de thread (TLS)