मेरे पास एक volatile unsigned char array LedState[5] वैरिएबल है जो थ्रेड्स के बीच साझा किया जाता है। सरणी में प्रत्येक सूचकांक एक राज्य को दर्शाता है। प्रत्येक राज्य के अनुसार, एलईडी अलग-अलग क्रम में फ्लैश करेगी। एक धागा राज्य को सरणी में सेट करता है और सरणी सूचकांक के आधार पर दूसरा धागा एल ई डी फ्लैश करेगा।

void TurnOnled(state) {
   LedState[state] =1;
}
void TurnOffLed(state) {
   LedState[state] = 0;
}
int CheckLedState(state) {
   return LedState[state]? 1 : 0;
}
Thread 1
---------
TurnOnLed(3);
/*Set of instructions*/
TurnOffLed(3);

Thread 2
--------
if (CheckLedState(3)) {
   /*Flash LEDS according to state*/
else {/*do nothing*/}

मेरे पास जो समस्या है वह कभी-कभी थ्रेड 1 में होती है, मुझे तुरंत TurnOnLed और TurnOffLed की आवश्यकता होती है। मैं कैसे सुनिश्चित कर सकता हूं कि TurnOffLed को कॉल किए जाने से पहले थ्रेड 2 TurnOnLed को देखे। उपरोक्त सिर्फ एक साधारण उदाहरण है लेकिन वास्तव में लेडस्टेट वैरिएबल एक से अधिक थ्रेड से सेट और अनसेट है। लेकिन कोई भी राज्य अलग-अलग धागों से निर्धारित नहीं होता है।

1
GreenCoder 30 नवम्बर 2018, 13:43

1 उत्तर

सबसे बढ़िया उत्तर

आपको प्रति एलईडी एक सेमाफोर का उपयोग करना होगा जो सेट फ़ंक्शन सेट करता है और राज्य मिलने के बाद रीड फ़ंक्शन बंद हो जाता है। सेमाफोर स्पष्ट होने पर सेट फ़ंक्शन को केवल राज्य बदलना चाहिए। उदाहरण के लिए:

char LedState[5];
char LedSema [5];

void TurnOnled(state) {
   while (LedSema[state]) { /* wait until earlier change processed */ ; }
   LedState[state]= 1;      /* turn LED on */
   LedSema [state]= 1;      /* indicate state change */
}
void TurnOffLed(state) {
   while (LedSema[state]) { /* wait until earlier change processed */ ; }
   LedState[state]= 0;      /* turn LED off */
   LedSema [state]= 1;      /* indicate state change */
}
//Thread 1
//---------
TurnOnLed(3);
/*Set of instructions*/
TurnOffLed(3);

//Thread 2
//--------
if (LedSema[3]==1) {
    /* a change occured */
    if (LedState[3]) {
        /* turn on LED */
    }
    else {
        /* turn off LED */
    }
    LedSema[3]=0;  /* indicate change processed */
}
1
Paul Ogilvie 30 नवम्बर 2018, 12:12