2012-02-02 25 views
8

Şu anda temel bir iş parçacığı havuzu geliştiriyorum. C++ 11'in std::thread, std::condition_variable ve std::unique_lock ile birlikte kullandım. Çalışıyor gibi görünüyor ve şimdi çok fazla aktif olmayan bazı konuları öldürebilmek istiyorum. Şimdilik, işleri boost::function s std::queue aracılığıyla verilmektedir. Ben boş bir boost::function s ekleyerek düşünüyorum böylece konuları onların döngüsünden çıkmak zorunda biliyorum. parçacığının döngü şu şekildedir:,Kendisini ayırmak ve sonlandırmak için bir std :: thread alın

void ThreadPool::threadLoop() 
{ 
    boost::function<void()>  oThreadTask; 
    std::unique_lock<std::mutex> oLock(m_oTaskMutex); 

    while (1) 
    { 
     // m_oCV is a static std::condition_variable 
     // m_oTaskQueue is a static std::queue< boost::function<void()> > 
     m_oCV.wait(oLock, [](){ return m_oTaskQueue.size(); }); 
     oThreadTask = m_oTaskQueue.front(); 
     m_oTaskQueue.pop(); 
     m_oTaskMutex.unlock(); 
     if (oThreadTask.empty()) 
     break ; 
     oThreadTask(); 
    } 
    // ?? 
} 

şeydir ben döngü çıkıldı kez düzgün iplik ayırmak için nasıl emin değilim. İplik tutamacını aramak için temiz olmalı (std::list<std::thread*>'a erişebilir ve kimliklerini std::this_thread::get_id() ile karşılaştırabilir) ve detach() iş parçacığının kendisinden veya join() numaralı telefondan bile arama güvenli midir?

cevap

11

Evet, tüm iplik nesneleri saklanan varsa, thread::idthis_thread::get_id() eşittir birini bulabilir ve bunun üzerine detach() arama ve C++ 11 standart değil (bundan sonra iplik nesne yok edebilir Bunu engellemek ve bunun ortak uygulamaya dayandığına inanıyorum). Başka hiçbir yürütme iş parçacığının yok olan std::thread örneğine erişmediğinden emin olun.

Ama iplik kendisinden join() diyemezsin: çıkmaza neden olacaktır kendisiyle katılmak için bir iş parçacığı için bir girişim ve bu tanıyacak ve resource_deadlock_would_occur hata koşulu ile system_error atarsam C++ 11 uygulamaları.

Alternatif olarak, ana iş parçacığı için std::thread belirli bir örneğiyle ilişkili evre çalışmasını tamamlamak ve ana iş parçacığı bununla katılmasına izin üzere olduğunu (std :: atom değişken aracılığıyla örneğin) mesaj bırakabilirsiniz Daha sonraki bir noktada.

+0

Teşekkür ederiz. En kolay yol, iş parçacığının kendilerini ayırmasıdır. – Jukurrpa

İlgili konular