मेरे पास एक परिमित-राज्य मशीन का प्रतिनिधित्व करने वाली कक्षा है, जिसे हमेशा के लिए लूप में चलाना चाहिए और इसकी वर्तमान स्थिति की जांच करनी चाहिए। प्रत्येक राज्य मशीन में यह अगला राज्य सेट करेगा और या तो idle
स्थिति में आ जाएगा या कुछ काम करेगा। मैं काम कर रहा है, जबकि मैं एक और थ्रेड मशीन की स्थिति बदलने की अनुमति देना चाहता हूँ। यह उम्मीद के रूप में दौड़ की स्थिति का कारण बन जाएगा। तो मैं मशीन के एक पारस्परिक बहिष्करण लॉक/अनलॉक रैपिंग लूप और सार्वजनिक विधि जो अन्य धागे को मशीन की वर्तमान स्थिति बदलने की अनुमति देता है।सी ++ में पारस्परिक बहिष्करण को संभालना 11
class Robot
{
public:
enum StateType {s1,s2,s3,idle,finish};
void run();
void move();
private:
StateType currentState;
StateType nextState;
StateType previousState;
std::mutex mutal_state;
};
कार्यान्वयन:
void Robot::run()
{
this->currentState = s1;
while(true)
{
mutal_state.lock();
switch(currentState)
{
case s1:
// do some useful stuff here...
currentState = idle;
nextState = s3;
break;
case s2:
// do some other useful stuff here...
currentState = idle;
nextState = finish;
break;
case s3:
// again, do some useful things...
currentState = idle;
nextState = s2;
break;
case idle:
// busy waiting...
std::cout << "I'm waiting" << std::endl;
break;
case finish:
std::cout << "Bye" << std::endl;
mutal_state.unlock();
return;
}
mutal_state.unlock();
}
}
और कदम विधि है कि अन्य थ्रेड वर्तमान स्थिति को बदलने के लिए अनुमति देता है:
void Robot::move()
{
mutal_state.lock();
previousState = currentState; // Booommm
currentState = nextState;
mutal_state.unlock();
}
मैं मैं गलत क्या कर रहा लगाने के लिए प्रबंधन नहीं कर सकते! कार्यक्रम move()
फ़ंक्शन की पहली पंक्ति में क्रैश हो जाता है। दूसरी ओर, GDB के साथ सी ++ 11 काम नहीं कर रहा है और पता लगाने कोड संभव नहीं है ...
अद्यतन:
कोड के आसपास बजाना, मैं देख सकता है कि समस्या कदम समारोह में है। जब प्रोग्राम move()
, क्रैश के अंदर कोड टुकड़ा लॉक करने का प्रयास करता है। उदाहरण के लिए यदि इस कदम इस तरह है:
void Robot::move()
{
std::cout << "MOVE IS CALLED" << std::endl;
mutal_state.lock();
//previousState = currentState;
//std::cout << "MOVING" << std::endl;
//currentState = nextState;
mutal_state.unlock();
}
आउटपुट है:
s1
I'm waiting
I'm waiting
MOVE IS CALLED1
The program has unexpectedly finished.
लेकिन जब move
एक साधारण कार्य है, कुछ नहीं कर रहा है:
void Robot::move()
{
std::cout << "MOVE IS CALLED" << std::endl;
//mutal_state.lock();
//previousState = currentState;
//std::cout << "MOVING" << std::endl;
//currentState = nextState;
//mutal_state.unlock();
}
कार्यक्रम समवर्ती चलाता है।
क्या आपने प्रिंट स्टेटमेंट्स के साथ डिबगिंग करने की कोशिश की है? – FrustratedWithFormsDesigner
@ निराश WithFormsDesigner: हाँ। मुझे पता है कि "विस्फोट" केवल तभी होता है जब कुछ धागा 'चाल' को कॉल करने का प्रयास करता है। –
आप किस कंपाइलर का उपयोग कर रहे हैं इसका संस्करण क्या है? – ildjarn