मुझे आश्चर्य है कि मैन्युअल रीसेट इवेंट के बराबर है? असल में, मुझे एक क्रॉस-प्लेटफ़ॉर्म कार्यान्वयन चाहिए ... या, क्या कोई मुझे बूस्ट :: थ्रेड का उपयोग करके मैन्युअल रीसेट इवेंट की कार्यक्षमता की नकल करने में मदद कर सकता है? धन्यवाद दोस्तोंमैन्युअल रीसेट इवेंट के बराबर बूस्ट?
उत्तर
आपके पास म्यूटेक्स और हालत चर के दौरान मैन्युअल रीसेट ईवेंट लिखना बहुत आसान है।
आपको जो चाहिए वह एक ऐसा क्षेत्र है जो दर्शाता है कि आपका रीसेट ईवेंट संकेतित है या नहीं। क्षेत्र तक पहुंच को म्यूटेक्स द्वारा संरक्षित करने की आवश्यकता होगी - इसमें आपके ईवेंट को सेट/रीसेट करना और यह देखने के लिए जांच करना शामिल है कि यह संकेत दिया गया है या नहीं।
जब आप अपने ईवेंट पर इंतजार कर रहे हैं, यदि वर्तमान में यह संकेत नहीं दिया गया है, तो आप सिग्नल वैरिएबल पर तब तक प्रतीक्षा करना चाहेंगे जब तक यह संकेत न हो। अंत में, आपके कोड में जो ईवेंट सेट करता है, आप अपनी घटना पर प्रतीक्षा करने वाले किसी को जागने के लिए कंडीशन वैरिएबल को सूचित करना चाहते हैं।
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_;
};
मुझे लगता है कि आपको काम करने के लिए 'boost :: condition_variable_any' का उपयोग करने की आवश्यकता हो सकती है। देखें: http://stackoverflow.com/questions/8758353/whats-the-difference-between-stdcondition-variable-and-stdcondition-variable – Nick
इसके अलावा, condition_variable_any :: प्रतीक्षा विधि को mutex को पैरामीटर के रूप में दिया जाना है, लॉक गार्ड नहीं। – Oliver
हम्म, मैं: त्रुटि C2664 'शून्य बढ़ावा :: condition_variable :: प्रतीक्षा (को बढ़ावा देने :: unique_lock
आईआईआरसी, ManualResetEvent
एस कई ऑब्जेक्ट्स को ऑब्जेक्ट पर प्रतीक्षा करने की अनुमति देने के लिए मौजूद है, और एक थ्रेड को ऑब्जेक्ट सिग्नल होने पर जागने के लिए मौजूद है। "मैन्युअल रीसेट" भाग इस तथ्य से आता है कि सिस्टम थ्रेड उठने के बाद ईवेंट को स्वचालित रूप से रीसेट नहीं करता है; आप इसके बजाय ऐसा करते हैं।
यह बहुत condition variables के समान लगता है:
सामान्य उपयोग के पैटर्न है कि एक धागा एक म्युटेक्स ताले और फिर
condition_variable
याcondition_variable_any
का एक उदाहरण परwait
कॉल है। जब थ्रेड प्रतीक्षा से जागृत होता है, तो यह जांचता है कि उचित स्थिति अब सच है या नहीं, और यदि ऐसा है तो जारी रखें। यदि स्थिति सत्य नहीं है, तो थ्रेड फिर से फिर से शुरू करने के लिएwait
पर कॉल करता है।
मैं मूल रूप से केवल एक लेखक धागा है जो हमेशा लिखना चाहिए और कभी भी अवरुद्ध नहीं होना चाहिए, जबकि मेरे पास एक पाठक धागा है जो केवल तब पढ़ सकता है जब लेखक लिख नहीं रहा है ... अगर यह समझ में आता है। धन्यवाद – Polaris878
मैं कहूंगा कि आपका डिज़ाइन समझ में आता है। –
आप कौन से ईवेंट फ़ंक्शंस अनुकरण करना चाहते हैं? – curiousguy