Armazenamento Local de Thread
Todos os threads de um processo compartilham seu espaço de endereço virtual. As variáveis locais de uma função são exclusivas para cada thread que executa a função. No entanto, as variáveis estáticas e globais são compartilhadas por todos os threads no processo. Com TLS ( de armazenamento local de thread), você pode fornecer dados exclusivos para cada thread que o processo pode acessar usando um índice global. Um thread aloca o índice, que pode ser usado pelos outros threads para recuperar os dados exclusivos associados ao índice.
A constante TLS_MINIMUM_AVAILABLE define o número mínimo de índices TLS disponíveis em cada processo. Esse mínimo é garantido como pelo menos 64 para todos os sistemas. O número máximo de índices por processo é de 1.088.
Quando os threads são criados, o sistema aloca uma matriz de valores LPVOID para TLS, que são inicializados como NULL. Antes que um índice possa ser usado, ele deve ser alocado por um dos threads. Cada thread armazena seus dados para um índice TLS em um slot TLS na matriz. Se os dados associados a um índice se ajustarem a um valor LPVOID, você poderá armazenar os dados diretamente no slot do TLS. No entanto, se você estiver usando um grande número de índices dessa forma, é melhor alocar armazenamento separado, consolidar os dados e minimizar o número de slots TLS em uso.
O diagrama a seguir ilustra como o TLS funciona. Para obter um exemplo de código que ilustra o uso do armazenamento local do thread, consulte Usando o Armazenamento Local do Thread.
O processo tem dois threads, Thread 1 e Thread 2. Ele aloca dois índices para uso com TLS, gdwTlsIndex1 e gdwTlsIndex2. Cada thread aloca dois blocos de memória (um para cada índice) no qual armazenar os dados e armazena os ponteiros para esses blocos de memória nos slots TLS correspondentes. Para acessar os dados associados a um índice, o thread recupera o ponteiro para o bloco de memória do slot TLS e os armazena na variável local lpvData.
É ideal usar o TLS em uma DLL (biblioteca de vínculo dinâmico). Para obter um exemplo, consulte Usando o Armazenamento Local de Thread em uma biblioteca de link dinâmico.
Tópicos relacionados
-
usando de armazenamento local de thread
-
usando o armazenamento local do thread em uma biblioteca de link dinâmico