मैं एक थ्रेड के एक थ्रेड का इंतजार करना चाहता हूं जो एक सिम्युलेटर में सिम्युलेटर में निष्पादित होने तक एक साथ सिम्युलेटर में निष्पादित किया जाता है, यह स्थिति सिम्युलेटर में प्रोग्राम चलाने के 1000 या अधिक चक्रों के बाद हो सकती है , हालत के बाद प्रतीक्षा थ्रेड फिर से निष्पादित किया, मैं इसे कैसे कर सकता हूं?एक शर्त होने तक प्रतीक्षा थ्रेड
उत्तर
आपको सशर्त चर की आवश्यकता है।
अपने संकलक std::conditional
द्वारा सी ++ 11 पेश किया समर्थन करता है, तो आप विस्तार के लिए देख सकते हैं:
अपने संकलक इसका समर्थन नहीं करता है, और आप के साथ काम Win32 धागे, तो यह देखें:
और here एक पूरा उदाहरण है।
और अगर आप POSIX धागे के साथ काम करते हैं, तो यह देखें:
आप conditional_variable
की मेरी कार्यान्वयन Win32 पुरातन का उपयोग कर देख सकते हैं:
नीचे स्क्रॉल करें और इसे पहले कार्यान्वयन देखें, फिर समवर्ती कतार कार्यान्वयन में उपयोग देखें।
//lock the mutex first!
scoped_lock myLock(myMutex);
//wait till a condition is met
myConditionalVariable.wait(myLock, CheckCondition);
//Execute this code only if the condition is met
जहां CheckCondition
एक समारोह (या functor) जो हालत की जाँच करता है:
सशर्त चर का एक विशिष्ट उपयोग यह है। इसे wait()
द्वारा आंतरिक रूप से फ़ंक्शन कहा जाता है जब यह नकली जागता है और यदि स्थिति अभी तक नहीं मिली है, तो wait()
फ़ंक्शन फिर से सो जाता है। सोने जाने से पहले, wait()
म्यूटेक्स, परमाणु रूप से जारी करता है।
यदि आपके पास C++ 11 नहीं है, लेकिन आपके पास एक सिस्टम है जो POSIX थ्रेड का समर्थन करता है, तो आप एक शर्त चर का उपयोग कर सकते हैं। अन्य विकल्प भी हैं, लेकिन एक शर्त परिवर्तनीय आपकी समस्या का वर्णन करने के तरीके के अनुसार सबसे सीधे आगे हो सकता है।
एक pthread स्थिति चर एक mutex के संयोजन के रूप में प्रयोग किया जाता है। कंडीशन वैरिएबल के साथ चाल यह है कि इस पर प्रतीक्षा करने से अधिग्रहित म्यूटेक्स को रिहा कर दिया जाता है, जब तक कि प्रतीक्षा कॉल रिटर्न न हो जाए, जिस बिंदु पर म्यूटेक्स को फिर से हासिल किया गया है।अनुक्रम है:
- अधिग्रहण म्युटेक्स
- जबकि िवधेय सच नहीं है
- हालत चर पर इंतजार
- महत्वपूर्ण अनुभाग
- पर काम करते हैं, तो िवधेय सच है
- सिग्नल कंडीशन वैरिएबल
- रिहाई म्युटेक्स
संकेत कदम मामले में प्रयोग किया जाता है एक से अधिक थ्रेड ऊपर ही महत्वपूर्ण अनुभाग में प्रवेश कर रहे हैं।
यदि कोई अलग थ्रेड उसी म्यूटेक्स तक पहुंच सकता है जो प्रीडिएक्ट को प्रभावित करता है, तो उस धागे को यह देखने के लिए जांच करनी चाहिए कि किसी को संकेत दिया जाना चाहिए या नहीं।
- अधिग्रहण म्युटेक्स
- महत्वपूर्ण अनुभाग
- पर काम करते हैं िवधेय सच
- संकेत हालत चर
- रिहाई म्युटेक्स
POSIX हित के आदेशों हो रहा है :
pthread_mutex_init()
pthread_mutex_destroy()
pthread_mutex_lock()
pthread_mutex_unlock()
pthread_cond_init()
pthread_cond_destroy()
pthread_cond_wait()
pthread_cond_signal()
सिग्नलिंग के लिए सेमफोर का उपयोग करना। उदाहरण (आवेदन साफ निकास) के रूप में नीचे:
हैडर में घोषित
static sem_t semPrepareExit; //declaration
स्रोत (मुख्य थ्रेड) में;
sem_init(&semPrepareExit, 0, 0); ///semaphore initialized
...
///now wait for the signal on the semaphore, to proceed hereforth
sem_post(&semPrepareExit);
/// cleanup ahead
...
स्रोत में, (पैदा की धागा);
...
sem_post(&semPrepareExit);
अब, जैसे ही आप सेमाफोर का उपयोग कर "sem_post" पर संकेत के रूप में। मुख्य धागे को प्रतीक्षा-नोड/बिंदु पर सिग्नल प्राप्त होगा, और आगे बढ़ेगा।
कुछ इस तरह का प्रयास करें:
class CmyClass
{
boost::mutex mtxEventWait;
bool WaitForEvent(long milliseconds);
boost::condition cndSignalEvent;
};
bool CmyClass::WaitForEvent(long milliseconds)
{
boost::mutex::scoped_lock mtxWaitLock(mtxEventWait);
boost::posix_time::time_duration wait_duration = boost::posix_time::milliseconds(milliseconds);
boost::system_time const timeout=boost::get_system_time()+wait_duration;
return cndSignalEvent.timed_wait(mtxEventWait,timeout); // wait until signal Event
}
// तो inorder प्रतीक्षा करने के लिए तो WaitForEvent विधि
WaitForEvent(1000); // it will timeout after 1 second
फोन // यह कैसे एक घटना का संकेत हो सकता है:
cndSignalEvent.notify_one();
- 1. स्विंगवर्कर पूरा होने तक प्रतीक्षा कैसे करें?
- 2. फ़ाइल बंद होने तक प्रतीक्षा कैसे करें
- 3. फ़ंक्शन लोड होने तक प्रतीक्षा करें
- 4. सभी सबप्रोसेस खत्म होने तक प्रतीक्षा प्रक्रिया?
- 5. WebBrowser.Print() पूर्ण होने तक प्रतीक्षा करें। .NET
- 6. जावास्क्रिप्ट: एक शर्त तक प्रतीक्षा करने के लिए गैर-अवरुद्ध तरीका
- 7. एक शर्त (pthread_cond_wait) और एक सॉकेट परिवर्तन (चयन) पर एक साथ प्रतीक्षा कर रहे हैं
- 8. जबकि एक शर्त चर
- 9. कंसोल एप्लिकेशन निष्क्रिय होने तक मैं कैसे प्रतीक्षा करूं?
- 10. रिमोट .NET डीबगर संलग्न होने तक कैसे प्रतीक्षा करें
- 11. एक्स्टजेस में सभी स्टोर लोड होने तक प्रतीक्षा कैसे करें?
- 12. jQuery ईवेंट ऑर्डर और एनीमेशन पूर्ण होने तक प्रतीक्षा
- 13. बाहरी प्रक्रिया पूरी होने तक प्रतीक्षा कर रहा है
- 14. jQuery .load() सामग्री लोड होने तक प्रतीक्षा करें
- 15. जावा थ्रेड प्रतीक्षा करें और
- 16. jQuery एसिंक एजेक्स कॉल समाप्त होने तक प्रतीक्षा करें
- 17. WatiN में पोस्टबैक पूरा होने तक प्रतीक्षा कैसे करें
- 18. Android में एक थ्रेड "प्रतीक्षा" कैसे करें
- 19. एक शर्त को पूरा होने तक असीमित रूप से जेएस को देरी
- 20. एक शर्त
- 21. एक शर्त
- 22. एक शर्त
- 23. जावा थ्रेड प्रतीक्षा() => अवरुद्ध?
- 24. थ्रेड प्रतीक्षा को समझने और
- 25. OutOfMemoryError - प्रतीक्षा प्रतीक्षा थ्रेड कचरा क्यों नहीं हो सकता है?
- 26. फ़ाइल.इक्सिस्ट तक प्रतीक्षा कैसे करें?
- 27. सर्वर पक्ष पर मॉन्गो के कनेक्शन तक तैयार होने तक क्लाइंट साइड पर कैसे प्रतीक्षा करें?
- 28. jQuery अजाक्स: * async * अनुरोध सफलता तक जारी होने तक प्रतीक्षा कैसे करें?
- 29. thread1 से कैसे प्रतीक्षा करें थ्रेड 2
- 30. कितने संसाधन सोते हैं और प्रतीक्षा थ्रेड
लुकअप सशर्त चर और सेमफोरस। –
वादे और वायदा पर भी एक नज़र डालें (http://en.cppreference.com/w/cpp/thread/promise) –