2016-03-23 24 views
0
class ThreadGuard { 
public: 
    ThreadGuard(std::thread &t_): t(t_) {} 
    ~ThreadGuard() 
    { 
     if(t.joinable()) 
      t.join(); 
    } 
private: 
    std::thread &t; 
}; 

void func() 
{ 
    std::thread my_thread(f); 
    ThreadGuard thread_guard(my_thread); 
} 

ThreadGuard nesnesini, iş parçacığı, iş parçacığı normal olarak sona erene kadar çıkmayacağından emin olmak için kullanmayı denerim. Ancak, thread_guard nesnesi oluşturulmadan hemen önce bir istisna meydana gelirse ne olur?Değişken tanımı sırasında bir istisna ihtimali var mıdır?

+1

İyi olmalı. Bir istisna atarsa, iplik yapısı başarısız demektir, daha sonra iş parçacığı çalıştırılmamalıdır, işlev çıkmalıdır. Doğru mu? – songyuanyao

+0

** - 1 ** 'if (t.joinable)' ** ** gerçek kod değildir **. –

+0

Üzgünüm, bir hata yaptım. Olmalı ise (t.joinable()) '. – song

cevap

0

RAII'nin noktası, kaynağın gerçekten sahibi olan kaynak edinme nesnesi içindir. ThreadGuard, hala iş parçacığının gerçekten korunduğunu garanti edemez.

class ThreadGuard { 
    std::thread t; 

public: 
    ~ThreadGuard() { 
     if (t.joinable()) t.join(); 
    } 

    // constructors and assignment as appropriate to actually 
    // initialize the thread object 
}; 

Bu şekilde, sadece yazabilirsiniz:

ThreadGuard thread_guard(f); 

değil endişelenmeyin Sen bir şey gibi daha isteyeceksiniz.

+0

Cevabınız için teşekkür ederiz. Ancak, uygun bir kurucunun nasıl uygulanacağını tam olarak anlamıyorum. Std :: thread t' adlı üyeyi başlatmanın tek doğru yolu, 'std :: thread' sınıfından miras alınıyor ve kurucuyu doğrudan kendi sınıfımın kurucusunda çağırıyor. Eğer durum buysa, bir parametreden geçmem gerekiyor…, nasıl yapılacağını, işlevini, çağrılabilir nesnesini veya bunun gibi bir şeyi yapmamı bilmem, yapıcım. Benim için biraz karmaşık. – song

İlgili konular