2009-12-29 8 views
12

मैं वर्तमान में बढ़ावा थ्रेड के लिए एक छोटा सा आवरण वर्ग पर काम कर रहा हूँ, लेकिन मैं वास्तव में न कैसे नींद समारोह काम करता हो, यह मैं अब तक क्या मिला है है:बूस्ट :: थ्रेड नींद() क्या करता है?

BaseThread::BaseThread(){ 
    thread = boost::thread(); 
    bIsActive = true; 
} 

BaseThread::~BaseThread(){ 
    join(); 
} 

void BaseThread::join(){ 
    thread.join(); 
} 

void BaseThread::sleep(uint32 _msecs){ 
    if(bIsActive) 
     boost::this_thread::sleep(boost::posix_time::milliseconds(_msecs)); 
} 

यह वह जगह है मैं कैसे लागू किया यह अब तक लेकिन मैं वास्तव में समझ नहीं पा रहा हूं कि यह स्थिर कैसे है :: नींद विधि जानता है कि कौन सा धागा सोना है उदाहरण के लिए मेरे थ्रेड रैपर के कई उदाहरण सक्रिय हैं। क्या इसे लागू करने का यह सही तरीका है?

उत्तर

17

boost::this_thread::sleep वर्तमान धागा सो जाएगा। केवल धागा ही सो सकता है। यदि आप थ्रेड नींद बनाना चाहते हैं, तो थ्रेड या use interruptions में कुछ चेक कोड जोड़ें।

अद्यतन: यदि आप अद्यतित मानक लाइब्रेरी के साथ एक सी ++ 11 कंपाइलर का उपयोग करते हैं, तो आपके पास std::this_thread::sleep_for और std::this_thread::sleep_until फ़ंक्शंस तक पहुंच होगी। हालांकि, कोई मानक बाधा तंत्र नहीं है।

+0

चेक कोड की तरह क्या? बाधा भी एक अच्छा तरीका प्रतीत होता है। – user240137

+0

"चेक कोड" से मेरा क्या मतलब है कि दिए गए थ्रेड द्वारा निष्पादित कोड में, कहीं भी 'अगर' होता है जो जांचता है कि उसे सोया जाना चाहिए और यदि आवश्यक हो तो इसे करें। उदाहरण के लिए यदि आपका धागा एक बड़े लूप के साथ एक फ़ंक्शन चलाता है, तो जांच करें कि क्या इसे नींद की आवश्यकता है (उदाहरण के लिए अपने वर्तमान कोड द्वारा बूलियन सेट को सेट करके) लूप के पुनरावृत्ति के प्रत्येक छोर पर पर्याप्त हो सकता है। लेकिन आपके मामले में आप अपने थ्रेड कोड पर घुसपैठ नहीं करना चाहते हैं, इसलिए बाधा वास्तव में बेहतर विकल्प की तरह लगती है। – Klaim

2

नींद हमेशा मौजूदा धागे को प्रभावित करती है (जो विधि को कॉल करता है)।