2010-12-01 25 views
6

Bir ileti dizisinden tüm diğer iş parçacıklarına hassas bir şekilde çıkmak için uygun yöntemlerle ilgili birkaç yöntem okudum (her iş parçacığı kendi çıkış yordamını gerçekleştirir). Bunlar arasında, herhangi bir iş parçacığından işaretlenebilen bir küresel atomik boolean fikrini sevdim ve tüm diğer iş parçacıkları bir çıkış rutini gerçekleştirmek için bu bayrağı kontrol ediyor - tüm iş parçacıkları birleştirildiğinde, ana iş parçacığı uygulamadan çıkabiliyor.Çok iş parçacıklı uygulamadan verimli çıkış (özellikler)

Tamamen hesaplama konuları muhtemelen farklı şekilde ele alınabilir, değil mi?

Bu verimli ve güvenli mi? Bunu yapmanın daha iyi bir yolu var mı?

Teşekkürler!

cevap

1

Windows'ta, bir özel durum oluşturan ve iş parçacıklarının temiz bir şekilde çıkmasına neden olan bir işlevi çağırmak için QueueUserAPC'yi kullanıyorum.

Burada bu yanıtında ayrıntıları hakkında daha fazla yazmış:

How do I guarantee fast shutdown of my win32 app?

Özetle, burada olur:

Say iplik A iplik B (ve daha sonra C D sonlandırmak istiyor ...)

  • İş parçacığı, bir iş parçacığının B iş parçacığı ve bir işlevini adresinin bir özel durum satırı için atıyor. ThreadExit.
  • B iş parçacığı, normalde uyarılabilir beklemeleri denetleyen bir şey çağırıncaya kadar çalışır. Belki WaitForSingleObjectEx, belki SleepEx veya başka bir şey. Bu noktada
  • , iplik B istisna istisna iplik B 'gevşemek' etrafa yapar gibi tüm yığın-tahsis nesneler otomatik olarak doğru tahrip olsun
  • Konu B'de atılmasına neden daha önce geçti APC işlevini çalıştırır.
  • B iş parçacığının en dıştaki iplik işlevi istisnayı yakalayacaktır.
  • Şimdiki başlık B çıkarıyor, muhtemelen bitmiş olan iş parçacığına işaret ediyor.
+0

akıllı geliyor, ama ben her zaman okuduğumda "bu çok hacky yoldur" hissini sallayamıyorum ... – Necrolis

+0

Taşınabilir olmadığını kabul ediyorum ama çoğu diğer çözümler üçüncü tarafın gerçekliğini kısıtlıyor. Konularınızda kullanabileceğiniz kod. Ağları yoğun olarak kullanıyorum ve güvenli bir şekilde 'durdurulabilecek' üçüncü taraf ağ kütüphanelerine (örneğin Indy) ihtiyacım var. – Roddy

+0

Hala daha detaylı açıklamalardan bile anlayamıyorum. Bir iş parçacığı içinde çıkmak istediğinizde QueueUserAPC kullanırsınız ve bu durum bir istisna atar ve bu istisna her iş parçacığına ulaşır. Yıkıcılar nasıl adlandırılır ve istisna atma işlevi nasıl görünür? (Programlamanın tüm alanı benim için yeni) Teşekkürler! – oneminute

4

Ne zaman ne yapacağımı bilmek için boolean (veya diğer) durum değişkenlerini denetleyen iş parçacıklarının hayranı değilim çünkü bu savurganlıktır. İplikler, yeni talimatlar olup olmadığını görmek için değişkeni sürekli kontrol etmek zorunda kalır. Bu CPU'yu yakar.

Daha iyi bir seçenek semafor oluşturmak veya Windows'da bir etkinlik oluşturmak ve tüm iş parçacıklarının üzerinde beklemektir. İş parçacığı meşgulken uyuyabilir ve bir değişkeni kontrol etmek için gerçek iş yapmak üzere diğer iş parçacıklarından zaman dilimleri çalmaz.

+0

(Paralel teoride yeniyim) Uygulamam özeldir Windows - Konular bir olay üzerinde nasıl bekler? Bana gösterebileceğin herhangi bir kaynak var mı? – oneminute

+0

Windows'da, CreateEvent() tarafından oluşturulan bir olayı beklemek için WaitForSingleObject() işlev ailesini kullanırsınız. Link: http://msdn.microsoft.com/en-us/library/ms682396(VS.85).aspx –

+0

Biraz kafam karıştı .. bu yüzden her iş parçacığında WaitForSingleObject (exitHandle, 0) dönüşünü kontrol ediyorum Çıkış olayının sinyalli olup olmadığını görmek için? – oneminute

İlgili konular