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