Makale numarası: 163449 - Son Gözden Geçirme: 21 Şubat 2007 Çarşamba - Gözden geçirme: 4.2 Bir genişletilmiş saklı yordamı iş parçacığı yerel depolama kullanımda
Bu SayfadaÖzetIş parçacığı yerel depolama (TLS), çok hassas bir konu olabilir. Ortam havuzu iş parçacığı içinde çalışırken, TLS ve iş parçacığı etkileşimleri sonuçları anlamak çok önemlidir. Microsoft SQL Server gibi bir ortam havuzu bir iş parçacığında TLS önlemek önerilir. Ancak, TLS kullanmanız gerekiyorsa, lütfen dikkatle bu belgeyi okuyun ve TLS ve DLL ana işlevler için Win32 SDK'sındaki çevrimiçi belgelere bakın. Ayrıca, genişletilmiş saklı yordamda derleyici yönergesini __declspec(thread) desteklenmiyor. LoadLibarary gerçekleştiğinde __declspec(thread) tanım düzgün başlatılamadı. Daha fazla bilgi için bkz: Jeffrey Ricter tarafından "Windows Gelişmiş". Not: SQL Server'a genişletilmiş saklı yordamlar da dahil olmak üzere, herhangi bir uzantısı hiçbir zaman DisableThreadLibraryCalls() çağrı yapabilir. Daha fazla bilgiBelirtildiği gibi işlev çağrılarını TlsSetValue ve TlsGetValue kullanılan dizin değeri TlsAlloc işlevini verir. Belgelere DLLMain işlevinizin TlsAlloc işlev çağrısı önerir, ul_reason_for_call DLL_PROCESS_ATTACH =. Varsayılan olarak, başlangıçta yüklenen DLL'NIN DLL_PROCESS_ATTACH denir. DLL_PROCESS_ATTACH ve DLL_THREAD_ATTACH, bellek ve TlsSetValue arayın. Bu, özellikle iş parçacığı havuzu senaryosunda bazı sorunlara neden başladığı olur. Aşağıda, havuzu iş parçacığı herhangi bir uygulama için geçerli bir örnek senaryodur. Bu örnek Microsoft SQL sunucu uygulamasını kullanır. Birkaç temellerini öğrenmeniz gerekir, örneğin şunlardır: Bu tüm altında DLLMain işlevi Win32 SDK belgelerinde ayrıntılı olarak belgelenmektedir.
Thread ATTACH CALLED COMMAND USER
------------------------------------------------
1 NO select Joe
2 YES xp_test Mary
3 YES select Adam
1 NO xp_test Lynn
Can, uzun süren bir seçme deyimini başlatır. Bu nedenle yolu olarak DLL_ATTACH işleminin hiç kimsenin genişletilmiş saklı yordamı henüz xp_test kullandı. Gamze, Can'ın seçin çalışırken xp_test çalışır. Mekanizması havuzu iş parçacığı, yeni bir iş parçacığı isteğine hizmet Can'ın kökenli belirler. SQL Server, daha sonra Xproc.dll dosyasını yüklemek için LoadLibrary işlevini çağırır. Böylece, DLL_PROCESS_ATTACH olarak adlandırılır; bu nedenle, dll DOSYASıNıN eklemek için ilk iş parçacığının iş parçacığı 2 olur. Daha önce anlatıldığı gibi TlsAlloc genişletilmiş saklı yordamın TLS dizin değeri'ni başlatmak için çağrılabilir. Gamze, Can'ın ve Can'ın komutlarını çalıştırırken, kendi seçme gönderir. Yeniden Gamze'nın bir isteği işlemek için yeni bir iş parçacığı kökenli. LoadLibrary yer aldığı sonra iş parçacığı 3 kökenli olduğundan, iş parçacığının 3 DLL_THREAD_ATTACH çağırır. Belirtildiği gibi 3 iş parçacığı için bellek ayrılamadı ve TlsSetValue call budur. Can'ın seçin tamamlandığını varsayalım, şimdi, böylece işçi iş parçacığı 1 kullanımı için ücretsizdir. Lynn xp_test komutu gönderir ve iş parçacığı 1 atanır. Önceden 1 numaralı olan iş parçacığı, hiçbir zaman DLL_PROCESS_ATTACH veya DLL_THREAD_ATTACH çağırır, iş parçacığının önce kökenli çünkü LoadLibrary çağrıldı. Bu örnekte, TlsGetValue ile TLS belleğe erişme girişimleri 1 iş parçacığı tarafından bir NULL işaretçisiyle verilen sonuçlar görebilirsiniz. Bu koşulu denetlemek için genişletilmiş saklı yordamın düzgün yazılmaz, NULL adresine yazmaya çalıştığınızda erişim ihlali oluşuyor (AV) karşılaşırsınız. Aşağıda belirtilen iş parçacığı havuzu ve TLS hakkında gereken birkaç nokta şunlardır. TLS havuz bir ortamda kullanıyorsanız, her zaman NULL bir dönüş değeri için TlsGetValue denetlemeniz gerekir. NULL geldiğinizde, bellek ve çağrı LoadLibrary yer aldığı için önce kökenli burada akıtır TlsSetValue olanlar işlemek için doğru tahsis gerekir. Başka bir uyarı doğrudan belgelerinde açıklanan bile, iş parçacığının DLL dosyasında hiçbir zaman işlevlerini kullanır, DLLMain işlevi TLS bellekte sonra LoadLibarary, kökenli her iş parçacığı için tahsis, ' dir. Yukarıdaki örnekte, bu iş parçacığıyla 3 gösterir. Yalnızca bir seçin çalıştı, ancak, genişletilmiş saklı yordamı için TLS bellek tahsis DLL_THREAD_ATTACH adlı. Bir ortam havuzu iş parçacığı bu tasarım koyarsanız, her zaman kullanılabilir bellek ayrılamadı. Bellek ayırma en iyi duruma getirmek için en iyi yolu şudur:
Aşağıdaki örnekte açıklanan davranış gösteren bir genişletilmiş saklı yordamdır: Daha fazla bilgiSQL Server 7.0 ve SQL Server 2000 FiberBiz kesinlikle TLS kullanarak engelleyin ve fiber modunda TLS kullanan tekrar yapmayı desteklemez. Fiber modunda, herhangi bir TLS güvenli değil hale getirme, çeşitli nedenlerle fiziksel iş parçacığının değiştirilebilir.Bu makaledeki bilginin uygulandığı durum:
Otomatik TercümeÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir. Makalenin İngilizcesi aşağıdaki gibidir:163449
(http://support.microsoft.com/kb/163449/en-us/
)
| Diğer Kaynaklar Diğer Destek Siteleri
ToplulukHemen Yardım AlMakale çevirileri
|






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


Üste