2012-06-11 22 views
16

मैं एक थ्रेड के एक थ्रेड का इंतजार करना चाहता हूं जो एक सिम्युलेटर में सिम्युलेटर में निष्पादित होने तक एक साथ सिम्युलेटर में निष्पादित किया जाता है, यह स्थिति सिम्युलेटर में प्रोग्राम चलाने के 1000 या अधिक चक्रों के बाद हो सकती है , हालत के बाद प्रतीक्षा थ्रेड फिर से निष्पादित किया, मैं इसे कैसे कर सकता हूं?एक शर्त होने तक प्रतीक्षा थ्रेड

+1

लुकअप सशर्त चर और सेमफोरस। –

+0

वादे और वायदा पर भी एक नज़र डालें (http://en.cppreference.com/w/cpp/thread/promise) –

उत्तर

23

आपको सशर्त चर की आवश्यकता है।

अपने संकलक 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() म्यूटेक्स, परमाणु रूप से जारी करता है।

5

यदि आपके पास 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() 
1

सिग्नलिंग के लिए सेमफोर का उपयोग करना। उदाहरण (आवेदन साफ ​​निकास) के रूप में नीचे:

हैडर में घोषित

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" पर संकेत के रूप में। मुख्य धागे को प्रतीक्षा-नोड/बिंदु पर सिग्नल प्राप्त होगा, और आगे बढ़ेगा।

0

कुछ इस तरह का प्रयास करें:

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(); 
संबंधित मुद्दे