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 o TLS ( 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 para ser 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 TLS. No entanto, se você estiver usando um grande número de índices dessa maneira, é 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 de thread, consulte Usando o Armazenamento Local de 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) nos quais 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 vínculo dinâmico.
Tópicos relacionados