2009-09-30 9 views
12

मुझे आश्चर्य है कि मैन्युअल रीसेट इवेंट के बराबर है? असल में, मुझे एक क्रॉस-प्लेटफ़ॉर्म कार्यान्वयन चाहिए ... या, क्या कोई मुझे बूस्ट :: थ्रेड का उपयोग करके मैन्युअल रीसेट इवेंट की कार्यक्षमता की नकल करने में मदद कर सकता है? धन्यवाद दोस्तोंमैन्युअल रीसेट इवेंट के बराबर बूस्ट?

+0

आप कौन से ईवेंट फ़ंक्शंस अनुकरण करना चाहते हैं? – curiousguy

उत्तर

12

आपके पास म्यूटेक्स और हालत चर के दौरान मैन्युअल रीसेट ईवेंट लिखना बहुत आसान है।

आपको जो चाहिए वह एक ऐसा क्षेत्र है जो दर्शाता है कि आपका रीसेट ईवेंट संकेतित है या नहीं। क्षेत्र तक पहुंच को म्यूटेक्स द्वारा संरक्षित करने की आवश्यकता होगी - इसमें आपके ईवेंट को सेट/रीसेट करना और यह देखने के लिए जांच करना शामिल है कि यह संकेत दिया गया है या नहीं।

जब आप अपने ईवेंट पर इंतजार कर रहे हैं, यदि वर्तमान में यह संकेत नहीं दिया गया है, तो आप सिग्नल वैरिएबल पर तब तक प्रतीक्षा करना चाहेंगे जब तक यह संकेत न हो। अंत में, आपके कोड में जो ईवेंट सेट करता है, आप अपनी घटना पर प्रतीक्षा करने वाले किसी को जागने के लिए कंडीशन वैरिएबल को सूचित करना चाहते हैं।

class manual_reset_event 
{ 
public: 
    manual_reset_event(bool signaled = false) 
     : signaled_(signaled) 
    { 
    } 

    void set() 
    { 
     { 
      boost::lock_guard<boost::mutex> lock(m_); 
      signaled_ = true; 
     } 

     // Notify all because until the event is manually 
     // reset, all waiters should be able to see event signalling 
     cv_.notify_all(); 
    } 

    void unset() 
    { 
     boost::lock_guard<boost::mutex> lock(m_); 
     signaled_ = false; 
    } 


    void wait() 
    { 
     boost::lock_guard<boost::mutex> lock(m_); 
     while (!signaled_) 
     { 
      cv_.wait(lock); 
     } 
    } 

private: 
    boost::mutex m_; 
    boost::condition_variable cv_; 
    bool signaled_; 
}; 
+1

मुझे लगता है कि आपको काम करने के लिए 'boost :: condition_variable_any' का उपयोग करने की आवश्यकता हो सकती है। देखें: http://stackoverflow.com/questions/8758353/whats-the-difference-between-stdcondition-variable-and-stdcondition-variable – Nick

+0

इसके अलावा, condition_variable_any :: प्रतीक्षा विधि को mutex को पैरामीटर के रूप में दिया जाना है, लॉक गार्ड नहीं। – Oliver

+0

हम्म, मैं: त्रुटि C2664 'शून्य बढ़ावा :: condition_variable :: प्रतीक्षा (को बढ़ावा देने :: unique_lock और)': 'को बढ़ावा देने :: lock_guard' को 'को बढ़ावा देने :: unique_lock और' से पैरामीटर 1 परिवर्तित नहीं कर सकते यह मैं condition_variable_any का उपयोग करता हूं, मुझे अनलॉक() विधि के बारे में condition_variable के अंदर एक और त्रुटि मिलती है। – Alexander

1

आईआईआरसी, ManualResetEvent एस कई ऑब्जेक्ट्स को ऑब्जेक्ट पर प्रतीक्षा करने की अनुमति देने के लिए मौजूद है, और एक थ्रेड को ऑब्जेक्ट सिग्नल होने पर जागने के लिए मौजूद है। "मैन्युअल रीसेट" भाग इस तथ्य से आता है कि सिस्टम थ्रेड उठने के बाद ईवेंट को स्वचालित रूप से रीसेट नहीं करता है; आप इसके बजाय ऐसा करते हैं।

यह बहुत condition variables के समान लगता है:

सामान्य उपयोग के पैटर्न है कि एक धागा एक म्युटेक्स ताले और फिर condition_variable या condition_variable_any का एक उदाहरण पर wait कॉल है। जब थ्रेड प्रतीक्षा से जागृत होता है, तो यह जांचता है कि उचित स्थिति अब सच है या नहीं, और यदि ऐसा है तो जारी रखें। यदि स्थिति सत्य नहीं है, तो थ्रेड फिर से फिर से शुरू करने के लिए wait पर कॉल करता है।

+0

मैं मूल रूप से केवल एक लेखक धागा है जो हमेशा लिखना चाहिए और कभी भी अवरुद्ध नहीं होना चाहिए, जबकि मेरे पास एक पाठक धागा है जो केवल तब पढ़ सकता है जब लेखक लिख नहीं रहा है ... अगर यह समझ में आता है। धन्यवाद – Polaris878

+0

मैं कहूंगा कि आपका डिज़ाइन समझ में आता है। –