Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
iş parçacığı havuzu, uygulama adına zaman uyumsuz geri çağırmaları verimli bir şekilde yürüten bir çalışan iş parçacıkları koleksiyonudur. İş parçacığı havuzu öncelikli olarak uygulama iş parçacığı sayısını azaltmak ve çalışan iş parçacıklarının yönetimini sağlamak için kullanılır. Uygulamalar iş öğelerini kuyruğa alabilir, çalışmayı beklenebilir tanıtıcılarla ilişkilendirebilir, iş öğelerini bir zamanlayıcıya göre otomatik olarak kuyruğa alabilir ve G/Ç’ye bağlanabilir.
İş Parçacığı Havuzu Mimarisi
Aşağıdaki uygulamalar, bir iş parçacığı havuzunun kullanımından yararlanabilir:
- Yüksek düzeyde paralel olan ve zaman uyumsuz olarak çok sayıda küçük iş öğesi (dağıtılmış dizin araması veya ağ G/Ç gibi) gönderebilen bir uygulama.
- Her biri kısa süre çalışan çok sayıda iş parçacığı oluşturan ve sonlandıran bir uygulama. İş parçacığı havuzunun kullanılması, iş parçacığı yönetiminin karmaşıklığını ve iş parçacığı oluşturma ve yok etmeyle ilgili ek yükü azaltabilir.
- Arka planda ve paralel olarak bağımsız iş öğelerini işleyen bir uygulama (birden çok sekmeyi yükleme gibi).
- Çekirdek nesneleri üzerinde münhasır bekleme yapması veya bir nesne üzerindeki gelen olaylar nedeniyle bloke olması gereken bir uygulama. İş parçacığı havuzunun kullanılması, iş parçacığı yönetiminin karmaşıklığını azaltabilir ve bağlam anahtarı sayısını azaltarak performansı artırabilir.
- Olayları beklemek için özel bekleyici iş parçacıkları oluşturan bir uygulama.
Orijinal iş parçacığı havuzu Windows Vista'da tamamen baştan tasarlanmıştır. Yeni iş parçacığı havuzu, tek bir çalışan iş parçacığı türü sağladığından (hem G/Ç'yi hem de G/Ç olmayanları desteklediğinden), zamanlayıcı iş parçacığı kullanmadığından, tek bir zamanlayıcı kuyruğu sağladığından ve ayrılmış bir kalıcı iş parçacığı sağladığından geliştirilmiştir. Ayrıca temizleme grupları, daha yüksek performans, bağımsız olarak zamanlanan işlem başına birden çok havuz ve yeni bir iş parçacığı havuzu API'sini sağlar.
İş parçacığı havuzu mimarisi aşağıdakilerden oluşur:
- Geri çağırma işlevlerini yürüten çalışan iş parçacıkları
- Birden çok bekleme tutamacı üzerinde bekleyen garson iş parçacıkları
- İş kuyruğu
- Her işlem için varsayılan iş parçacığı havuzu
- İş parçacıklarını yöneten bir iş parçacığı fabrikası
En İyi Yöntemler
Yeni iş parçacığı havuzu API', özgün iş parçacığı havuzu API'sinden daha fazla esneklik ve denetim sağlar. Bununla birlikte, birkaç küçük ama önemli fark vardır. Özgün API'de bekleme sıfırlaması otomatikti; yeni API'de beklemenin her seferinde açıkça sıfırlanması gerekir. Özgün API, çağrı işleminin güvenlik bağlamını iş parçacığına aktararak kimliğe bürünmeyi otomatik olarak işledi. Yeni API ile uygulamanın güvenlik bağlamını açıkça ayarlaması gerekir.
Aşağıdakiler, iş parçacığı havuzu kullanırken izlenmesi gereken en iyi uygulamalardır:
Bir işlemin iş parçacıkları iş parçacığı havuzunu paylaşır. Tek bir çalışan iş parçacığı, tek tek birden çok geri çağırma işlevi yürütebilir. Bu çalışan iş parçacıkları iş parçacığı havuzu tarafından yönetilir. Bu nedenle, iş parçacığı havuzundaki bir iş parçacığını, iş parçacığı üzerinde TerminateThread çağırarak veya bir geri çağırma işlevinden ExitThread çağırarak sonlandırmayın.
G/Ç isteği, iş parçacığı havuzundaki herhangi bir iş parçacığında çalıştırılabilir. Bir iş parçacığı havuzundaki bir iş parçacığında G/Ç’nin iptal edilmesi senkronizasyon gerektirir; çünkü iptal işlevi, G/Ç isteğini işleyen iş parçacığından farklı bir iş parçacığında çalışabilir ve bu da bilinmeyen bir işlemin iptal edilmesine neden olabilir. Bunu önlemek için, zaman uyumsuz G/Ç için CancelIoEx çağrılırken G/Ç isteğinin başlatıldığı OVERLAPPED yapısını her zaman belirtin ya da CancelSynchronousIo veya CancelIoEx işlevlerinden herhangi birini çağırmadan önce, hedef iş parçacığında başka hiçbir G/Ç işleminin başlatılamamasını sağlamak için kendi eşitleme mekanizmanızı kullanın.
İşlevden dönmeden önce geri çağırma işlevinde oluşturulan tüm kaynakları temizleyin. Bunlar TLS, güvenlik bağlamları, iş parçacığı önceliği ve COM kaydıdır. Geri çağırma işlevleri, geri dönmeden önce iş parçacığının durumunu da geri yüklemelidir.
İş parçacığı havuzu, tutamaçla işinin bittiğini bildirene kadar bekleme tutamaçlarını ve bunlarla ilişkili nesneleri yaşatın.
İş parçacığı havuzunun bu iş parçacığını beklemek yerine yeni iş parçacıkları ayırabilmesi için, uzun süren işlemleri (G/Ç boşaltmaları veya kaynak temizleme gibi) beklemekte olan tüm iş parçacıklarını işaretleyin.
İş parçacığı havuzunu kullanan bir DLL'yi kaldırmadan önce tüm iş öğelerini, G/Ç'yi, bekleme işlemlerini ve zamanlayıcıları iptal edin ve geri çağırmaların yürütülmesini bekleyin.
İş öğeleri ve geri çağırmalar arasındaki bağımlılıkları ortadan kaldırarak, bir geri çağırmanın kendi tamamlanmasını beklemediğinden emin olarak ve iş parçacığı önceliğini koruyarak kilitlenmeleri önleyin.
Varsayılan iş parçacığı havuzunu kullanan diğer bileşenlerin bulunduğu bir işlem içinde, kuyruğa çok fazla öğeyi çok hızlı eklemeyin. İşlem başına Svchost.exede dahil olmak üzere bir varsayılan iş parçacığı havuzu vardır. Varsayılan olarak, her iş parçacığı havuzu en çok 500 çalışan iş parçacığı içerir. hazır/çalışıyor durumundaki çalışan iş parçacığı sayısının işlemci sayısından az olması gerektiğinde iş parçacığı havuzu daha fazla çalışan iş parçacığı oluşturmaya çalışır.
İş parçacığı havuzuyla uyumsuz olduğundan COM tek iş parçacıklı daire modelinden kaçının. STA, iş parçacığı için, sonraki iş öğesini etkileyebilecek bir iş parçacığı durumu oluşturur. STA genellikle uzun ömürlüdür ve iş parçacığı bağımlılığına sahiptir; bu da iş parçacığı havuzunun tersidir.
İş parçacığı önceliğini ve yalıtımını denetlemek, özel özellikler oluşturmak ve yanıt hızını artırmak için yeni bir iş parçacığı havuzu oluşturun. Ancak, ek iş parçacığı havuzları daha fazla sistem kaynağı (iş parçacıkları, çekirdek belleği) gerektirir. Çok fazla havuz cpu çekişmesi olasılığını artırır.
Mümkünse, iş parçacığı havuzundaki bir iş parçacığına sinyal vermek için APC tabanlı bir mekanizma yerine beklenebilir bir nesne kullanın. Sistem iş parçacığı havuzu iş parçacıklarının ömrünü denetlediğinden, APC'ler diğer sinyal mekanizmaları gibi iş parçacığı havuzu iş parçacıklarıyla da çalışmaz, bu nedenle bildirim teslim edilmeden önce bir iş parçacığının sonlandırılması mümkündür.
!tp iş parçacığı havuzu hata ayıklayıcısı uzantısını kullanın. Bu komut aşağıdaki kullanıma sahiptir:
- havuz adresibayrakları
- obj adresbayrakları
- tqueue adresbayrakları
- garson adresi
- çalışan adresi
Havuz, garson ve çalışan için adres sıfırsa, komut tüm nesneleri döküm eder. Garson ve çalışan için adresin atlanması geçerli iş parçacığının dökümünü alır. Aşağıdaki bayraklar tanımlanmıştır: 0x1 (tek satır çıktısı), 0x2 (üyeleri dök) ve 0x4 (havuz iş kuyruğunu dök).
Note
Modern seçenekler: C++/WinRT uygulamalarında Windows iş parçacığı havuzuna eş yordamlar aracılığıyla erişilebilir — işi iş parçacığı havuzuna göndermek için co_await winrt::resume_background() ve kullanıcı arabirimi iş parçacığına geri dönmek için co_await winrt::resume_foreground(dispatcher) kullanın. Bu, el ile geri çağırma yönetimi olmadan yapılandırılmış eşzamanlılık sağlar. Standart C++ kodu için, std::launch::async ilkesiyle std::async, taşınabilir görev tabanlı paralellik sunar; ancak Windows iş parçacığı havuzunu doğrudan kullanmaz.
İlgili konular