2010-10-19 8 views
16

Ben new operatör ile boost::thread nesne oluşturmak ve çalışmalarını bitirmek için bu konuyu beklemeden devam:Boost :: thread nesnesini, iş tamamlandıktan hemen sonra silmenin en iyi yolu nedir?

void do_work() 
{ 
    // perform some i/o work 
} 

boost::thread *thread = new boost::thread(&do_work); 

sanırım, bu iş bitince thread silmek gereklidir. İplik fesihini açıkça beklemeden bunun en iyi yolu nedir?

+1

Neden iş parçacığı dinamik olarak oluşturuyorsunuz? –

+0

@Martin York: Çünkü değişkenin kapsamından ayrıldıktan sonra thread nesnesinin yok edilmesini istemiyorum. – itsvetkov

+2

Ama eğer kapsam dışında kalmasına izin verirseniz, o zaman ona erişemezsiniz (ve böylece siz sızıyorsunuz). Erişime sahip olmamanız, onunla hiçbir şey yapamayacağınız ve asıl yürütme işleyişinin hala canlı olduğu anlamına gelir, bu yüzden anlamsızdır. Not: Pratik olarak ** NEVER ** gibi bir RAW işaretçisine sahip olmalısınız. –

cevap

19

boost::thread nesnesinin kullanım ömrü ve yerel iş parçacığının ömrü birbiriyle ilişkili değildir. boost::thread nesnesi, herhangi bir zamanda kapsam dışı kalabilir. boost::thread sınıfından

bir dosyanın süresi dosyayı temsil bir iostream nesnesinin yaşam süresi farklı olabilir gibi documentation

, yürütmenin ipliğin süresi akıştan farklı olabilir yürütme iş parçasını temsil eden nesne. Özellikle, join() öğesine yapılan bir çağrıdan sonra, iş parçacığı, normal iş parçasının sonuna kadar devam ettiği halde, iş parçacığı artık mevcut olmayacaktır. Sohbet de mümkündür; Bir iş parçacığı ilk önce çağrılan join() olmadan yok edilirse, yürütme iş parçacığı ilk işlevi tamamlanana kadar devam eder.

Düzenleme: Sadece join çağırmak bir iş parçacığı başlar ve asla gerekiyorsa, bir fonksiyonu olarak parçacığının yapıcısını kullanabilirsiniz: Ancak

// Launch thread. 
boost::thread(&do_work); 

, bunu yapmana önermiyoruz , iş parçacığının main() yapmadan önce tamamlandığından emin olsanız bile. İplik artık boost::thread nesne aittir müstakil sonra

+1

Teşekkür ederim. İpleri Artırmak için yeniyim, bu yüzden sorun nasıl çalıştığını yanlış anlamamda oldu. – itsvetkov

+0

Bildiğim kadarıyla bu, yerel konuların çoğu platformda nasıl çalıştığıdır. Dolayısıyla, iş parçacığı yıkıcı, istisnalar dışında bir karışıklık olacak olan join() olarak adlandırılmadıkça, bu yalnızca normal bir sonuçtur. –

13

Sen

boost::thread t(&do_work); 
t.detach(); 

kullanabilirsiniz; Nesne yok edilebilir ve iş parçacığı çalışmaya devam edecektir. boost::thread destructor ayrıca, detach() nesnesini de çalıştırıyorsa, eğer nesne çalışan bir iş parçacığına sahipse, t'un imha edilmesine izin vermek aynı sonucu verecektir.

3

Ben ne zaman iş parçacığı nesnesi silmek dikkat alışkanlık böylece, boost :: shared_ptr kullanmanızı öneririz.

boost::shared_ptr<boost::thread> thread(new boost::thread(&do_work)); 
+1

Bu iş parçacığı nesnesi, "do_work" işlemi bittiğinde nasıl silinir? –

İlgili konular