INFO: Visão geral de armazenamento local de thread

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 94804
Sumário
Armazenamento local de thread (TLS) é um método pelo qual cada thread em um determinado processo é fornecido um locais para armazenar dados específicos de segmento.

Existem quatro funções para TLS: TlsAlloc(), TlsGetValue(), TlsSetValue() e TlsFree(). Essas funções manipulam índices TLS, quais se referem a áreas de armazenamento para cada segmento em um processo. Um determinado índice é válido somente dentro do processo que alocada a ele.

Observe que o compilador Visual C++ oferece suporte a uma sintaxe alternativa:
_declspec (thread)
que pode ser usado no lugar de chamar essas APIs diretamente. Por favor consulte a descrição de _declspec no VC ++ helpfile "Idioma e ajuda de tempo de execução" para obter mais informações.
Mais Informações
Uma chamada para TlsAlloc() retorna um índice TLS global. Esse um índice TLS é válido para cada thread dentro do processo que alocado-lo e, portanto, deve ser salvos em uma variável global ou estática.

Armazenamento local de segmento funciona da seguinte maneira: quando TlsAlloc() é chamado, cada thread dentro do processo tem seu próprio espaço particular em tamanho normal ULONG_PTR reservado para ele (na pilha de seu espaço, mas isso é específicos de implementação). No entanto, somente um índice TLS é retornado. Esse único índice TLS pode ser usado por cada segmento do processo para referir-se o espaço exclusivo que TlsAlloc() reservada para ele.

Por esse motivo, TlsAlloc() costuma ser chamada apenas uma vez. Isso é conveniente para DLLs, que podem distinguir entre DLL_PROCESS_ATTACH (onde segmento do primeiro processo está se conectando para a DLL) e DLL_THREAD_ATTACH (os threads subseqüentes do processo de anexar). Por exemplo, o primeiro thread chama TlsAlloc() e armazena o índice TLS em uma variável global ou estática, e todos os outros threads que liga para a DLL se refere a variável global para acessar seu espaço de armazenamento local.

Embora um índice TLS seja geralmente suficiente, um processo pode ter até TLS_MINIMUM_AVAILABLE índices (garantias de ser maior ou igual a 64).

Depois de um índice TLS tem sido alocado (e armazenado), os segmentos no processo do podem usá-lo para definir e recuperar valores em seus espaços de armazenamento. Um thread pode armazenar qualquer valor tamanho ULONG_PTR em seu armazenamento local (por exemplo, um valor ULONG_PTR, um ponteiro para alguns memória alocada dinamicamente e assim por diante). As APIs TlsGetValue() e TlsSetValue() são usadas para essa finalidade.

Um processo deve liberar índices TLS com TlsFree() quando ele tiver terminado de usá-los. No entanto, se qualquer segmentos no processo armazenou um ponteiro para a memória alocada dinamicamente em seus espaços de armazenamento local, é importante liberar a memória ou recuperar o ponteiro para ele antes de liberar o índice TLS ou serão perdida.

Para obter mais informações, consulte "Usando armazenamento thread local" na visão geral "Processos e threads" na "Referência do programador do Win32".

Exemplo

Thread A dentro de um processo chama TlsAlloc() e armazena o índice retornado no TlsIndex variável global:
   TlsIndex = TlsAlloc();				
Thread A em seguida, aloca 100 bytes de memória dinâmica e armazena em seu armazenamento local:
   TlsSetValue( TlsIndex, malloc(100) );				
Thread A cria o thread B, que armazena um identificador para uma janela no seu espaço de armazenamento local referenciado por TlsIndex.
   TlsSetValue( TlsIndex, (LPVOID)hSomeWindow );				
Observe que TlsIndex se refere a um local diferente quando o thread B usa, que quando o thread A utiliza. Cada thread tem seu próprio local chamado pelo mesmo valor em TlsIndex.

O thread B pode encerrar com segurança porque não é necessário liberar especificamente o valor no seu armazenamento local.

Antes de um segmento termina, no entanto, ele deve primeiro liberar a memória alocada dinamicamente no seu armazenamento local
   free( TlsGetValue( TlsIndex ) );				
e libere o índice TLS:
   if ( !TlsFree( TlsIndex ) )      // TlsFree() failed.  Handle error.				

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 94804 - Última Revisão: 11/21/2006 15:46:43 - Revisão: 4.1

Interface de Programação de Aplicativos do Microsoft Win32

  • kbmt kbinfo kbkernbase kbthread KB94804 KbMtpt
Comentários