ID do artigo: 163449 - Última revisão: quarta-feira, 21 de fevereiro de 2007 - Revisão: 4.2 Uso do armazenamento local de thread em um procedimento armazenado estendido
Nesta páginaSumárioArmazenamento de thread local (TLS) pode ser um assunto muito complicado. Ao trabalhar em um segmento de pool de ambiente, é muito importante que você entenda as implicações de TLS e as interações de thread. É altamente recomendável que você evitar TLS em um segmento de pool de ambiente, como Microsoft SQL Server. No entanto, se você deve usar o TLS, verifique cuidadosamente ler este documento e consulte a documentação on-line no SDK do Win32 para as principais funções TLS e DLL. Além disso, o __declspec(thread) de diretiva de compilador não tem suporte em um procedimento armazenado estendido. Quando LoadLibarary ocorre, a definição de __declspec(thread) não foi inicializada corretamente. Consulte "Windows Advanced" por Jeffrey Ricter para obter mais detalhes. Observação: Qualquer extensão para SQL Server, incluindo procedimentos armazenados estendidos, nunca pode fazer uma chamada para DisableThreadLibraryCalls(). Mais InformaçõesConforme documentado, a função TlsAlloc retorna um valor de índice que é usado em chamadas de função para TlsSetValue e TlsGetValue. A documentação sugere que você chama a função TlsAlloc em sua função DLLMain quando ul_reason_for_call = DLL_PROCESS_ATTACH. Por padrão, DLL_PROCESS_ATTACH é chamado quando a DLL é carregada inicialmente. Em DLL_THREAD_ATTACH e DLL_PROCESS_ATTACH, você deve alocar memória e chamar TlsSetValue. Isso é especificamente onde o pool de segmentos começa a causar alguns problemas no cenário. Abaixo está um cenário de exemplo que se aplica a qualquer aplicativo que thread do pool. Este exemplo usa o aplicativo do Microsoft SQL Server. A seguir estão algumas noções básicas para o exemplo que você deve compreender. Esses todos os são documentados em detalhes mais na documentação do SDK do Win32 em função DLLMain.
Thread ATTACH CALLED COMMAND USER
------------------------------------------------
1 NO select Joe
2 YES xp_test Mary
3 YES select Adam
1 NO xp_test Lynn
Jorge inicia uma instrução select execução demorada. Ninguém tem usado xp_test procedimento armazenado estendido ainda, portanto, não há nenhuma maneira para o processo DLL_ATTACH ser chamado. Enquanto estiver executando o selecione de José, Mary executará xp_test. O mecanismo do pool de segmento determina que um novo segmento deve ser gerado a solicitação de serviço Mary. SQL Server, em seguida, chama a função LoadLibrary para carregar o arquivo Xproc.dll. Ao fazer isso, o thread 2 é o primeiro thread para anexar o para a DLL, de modo que é chamado de DLL_PROCESS_ATTACH. Conforme discutido anteriormente, TlsAlloc pode ser chamado para inicializar valor de índice TLS do procedimento armazenado estendido. Enquanto os comandos de João e de Maria estiverem sendo executados, o ADAM envia seu próprio selecione. Novamente, um novo segmento é gerado para manipular a solicitação de ADAM. Porque o thread 3 é gerado após a LoadLibrary ocorreu, thread 3 chama DLL_THREAD_ATTACH. Conforme documentado, isso é onde você poderia alocar a memória para thread 3 e chamar TlsSetValue. Agora, suponha que selecione de José estiver concluída, portanto, segmento de trabalho 1 está livre para uso. Lynn envia o comando xp_test e é atribuída o thread 1. O thread 1 nunca chama DLL_PROCESS_ATTACH ou DLL_THREAD_ATTACH, porque o thread foi gerado antes da LoadLibrary foi chamada. Neste exemplo, você pode ver que qualquer tentativa de thread 1 para acessar a memória TLS com TlsGetValue resultará em um ponteiro NULL que está sendo retornado. Se o procedimento armazenado estendido não está escrito corretamente para verificar essa condição, você encontrará uma violação de acesso (VA) ao tentar gravar o endereço NULL. Abaixo estão vários pontos que precisa ser mencionado sobre TLS e pool de segmentos. Se você estiver usando TLS em um ambiente de pool, você sempre deve verificar TlsGetValue para um valor de retorno NULL. Quando chegar um NULL, você deve alocar corretamente memória e chamada TlsSetValue para manipular os segmentos que onde gerado antes da LoadLibrary ocorreu. Outra limitação abordada não diretamente a documentação é que você irá alocar a memória TLS na função DLLMain para cada thread gerado após LoadLibarary, mesmo se o thread nunca usa as funções na DLL. O exemplo acima mostra isso com thread 3. Executar somente uma seleção, mas ele chamado DLL_THREAD_ATTACH, que alocada a memória TLS para o procedimento armazenado estendido. Se você colocar esse design em um segmento de pool de ambiente, você pode alocar memória que nunca pode ser usada. Este é a melhor maneira para otimizar a alocação de memória:
Este é um procedimento armazenado estendido que mostra o comportamento descrito no exemplo: Mais InformaçõesSQL Server 7.0 e SQL Server 2000 fibrasÉ altamente desencorajar usando TLS e nós não oferecem suporte usando TLS no modo fibra. No modo de fibra, o thread físico pode ser alterado por vários motivos, tornando qualquer TLS não seguros.A informação contida neste artigo aplica-se a:
Tradução automáticaIMPORTANTE: 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: 163449
(http://support.microsoft.com/kb/163449/en-us/
)
| Outros Recursos Outros Sites de Suporte
ComunidadesObtenha Ajuda AgoraTraduções deste artigo
|






Windows Live
Facebook
Twitter
Linkedin
Digg it
Yahoo
Delicious
StumbleUpon
Yammer
Reddit
Technorati
FriendFeed
Email


Voltar para o início