2013-07-12 6 views
10

यह सभी के लिए एक गैर प्रोग्रामिंग प्रश्न हो सकता है, मैंने ईवेंट जैसे थ्रेड सिंक्रनाइज़ेशन ऑब्जेक्ट्स के बारे में पढ़ा है और यह सिग्नल या गैर-सिग्नल किए गए राज्य के रूप में कैसे सेट किया गया है। हालांकि मैं इन शर्तों को समझ नहीं पाया संकेतित और गैर-संकेतित। प्रत्येक ने अलग-अलग तरीकों से व्यक्त किया है और मैं थोड़ा उलझन में हूं।घटना की सिग्नल और गैर-संकेतित स्थिति

  1. This link कहा गया है कि

    एक संकेत राज्य इंगित करता है एक संसाधन के एक प्रक्रिया के लिए उपलब्ध है या इसका इस्तेमाल करने थ्रेड। एक संकेतित राज्य इंगित करता है कि संसाधन उपयोग में है।

  2. मैं एक विश्वविद्यालय साइट जिसमें कहा गया है कि

    एक वस्तु का संकेत स्थिति में है कि एक धागा है कि ब्लॉक करने के लिए वस्तु पर इंतज़ार कर रहा है और वस्तु का कारण नहीं बनेगा से एक पावर प्वाइंट प्रस्तुति है कि संकेतित स्थिति में नहीं है किसी भी थ्रेड का कारण बनता है जो उस ऑब्जेक्ट को तब तक अवरुद्ध करता है जब तक ऑब्जेक्ट फिर से संकेत न हो जाए।

  3. राज्यों इस

    एक घटना का संकेत राज्य में है इसका मतलब यह धागे के लिए इस घटना का संकेत होने की प्रतीक्षा कर रिलीज करने के लिए क्षमता है। एक घटना गैर संकेतित राज्य में है जिसका अर्थ यह है कि यह किसी भी धागे को जारी नहीं करेगा जो इस विशेष घटना की प्रतीक्षा कर रहा है।

एक उदाहरण के साथ इस अवधारणा पर एक साधारण स्पष्टीकरण वास्तव में उपयोगी होगा।

उत्तर

14

ठीक है, आपके 3 उद्धरण असंगत नहीं हैं। लेकिन चलिए कार्यान्वयन के लिए थोड़ा नीचे जाएं:

प्रत्येक प्रतीक्षा करने योग्य ऑब्जेक्ट में इसके साथ जुड़ा हुआ बूलियन मान होता है, जिसका नाम संकेतित राज्य है, जिसका उपयोग उस ऑब्जेक्ट के लिए प्रतीक्षा करने के लिए किया जाता है; यदि ऑब्जेक्ट संकेतित है, तो प्रतीक्षा फ़ंक्शन नहीं इसके लिए प्रतीक्षा करें; यदि ऑब्जेक्ट गैर-सिग्नल है, तो प्रतीक्षा फ़ंक्शन इसके लिए प्रतीक्षा करेगा।

अब, यह किसी विशेष प्रकार के ऑब्जेक्ट पर कैसे लागू होता है? यह वस्तुओं की प्रकृति और विशेष रूप से इसके इंतजार के लिए जुड़े अर्थशास्त्र पर निर्भर करता है। दरअसल, संकेतित स्थिति को प्रतीक्षा की स्थिति के संदर्भ में परिभाषित किया जाता है। उदाहरण के लिए (विवरण के लिए दस्तावेज़ देखें):

  • एक म्यूटेक्स का स्वामित्व होने पर संकेत किया जाता है।
  • प्रक्रिया समाप्त होने पर एक प्रक्रिया/धागा संकेत दिया जाता है।
  • इसकी गणना तब से संकेतित की जाती है जब इसकी गणना 0 से अधिक हो।
  • एक प्रतीक्षा योग्य टाइमर समाप्त होने पर संकेत दिया जाता है।

स्वामित्व के दौरान एक म्यूटेक्स संकेत दिए जाने पर आपको बेहतर लगेगा, लेकिन असल में यह स्वामित्व में नहीं है। प्रतीक्षा कार्यों को सही काम करने के लिए जरूरी है।

और घटनाओं के बारे में क्या? खैर, वे कुछ साधारण वस्तुएं हैं, आप उन्हें इच्छानुसार सिग्नल और डि-सिग्नल कर सकते हैं, इसलिए सिग्नल स्टेट का कोई अतिरिक्त अर्थ नहीं है:

  • संकेतित: थ्रेड इसके लिए प्रतीक्षा नहीं करेंगे।
  • गैर-संकेतित: थ्रेड इसके लिए प्रतीक्षा करेंगे।

घटनाक्रम भी इस SignalPulse और AutoReset चीजें हैं जो थोड़ा अजीब (और IME सही उपयोग करने के लिए व्यावहारिक रूप से असंभव) हैं।

अब, चलो आपके उद्धरण को देखो:

एक संकेत राज्य इंगित करता है एक संसाधन के एक प्रक्रिया के लिए उपलब्ध है या इसका इस्तेमाल करने थ्रेड। एक संकेतित राज्य इंगित करता है कि संसाधन उपयोग में है।

वास्तव में, यह एक व्याख्या है। आम तौर पर एक संसाधन होता है जिसे आप मध्यस्थ करने की कोशिश कर रहे हैं, और आम तौर पर यदि आप उस संसाधन का उपयोग कर रहे हैं, तो आमतौर पर आप प्रतीक्षा करते हैं, इसलिए यह संसाधन-इन-यूज और प्रतीक्षा-के-संसाधन के बीच समानता बना रहा है। लेकिन यह एक तकनीकी आवश्यकता नहीं है, बस एक सामान्य उपयोग-मामला।

एक वस्तु का संकेत स्थिति में है कि कि संकेत राज्य में नहीं है एक धागा है कि ब्लॉक करने के लिए वस्तु पर इंतज़ार कर रहा है और वस्तु का कारण नहीं बनेगा वस्तु जब तक ब्लॉक करने के लिए किसी भी धागा है कि उस वस्तु पर इंतजार कर रहा है कारण होगा फिर संकेत मिलता है।

सही और बिंदु पर!

एक घटना संकेतित राज्य में है जिसका अर्थ यह है कि इस घटना के संकेत के लिए इंतजार कर रहे धागे को छोड़ने की क्षमता है। एक घटना गैर संकेतित राज्य में है जिसका अर्थ यह है कि यह किसी भी धागे को जारी नहीं करेगा जो इस विशेष घटना की प्रतीक्षा कर रहा है।

मुझे यह शब्द थोड़ा उलझन में मिलता है ... लेकिन यह पिछले एक से कुछ भी नहीं जोड़ता है।

+0

बहुत अच्छी स्पष्टीकरण श्री रॉड्रिगो अंगूठे ऊपर। –

7

वैसे, वास्तव में ये सभी व्याख्याएं एकरूप हैं।

किसी ईवेंट की सबसे सरलीकृत (और इसलिए 100% सटीक) व्याख्यान एक घटना को ऑपरेटिंग सिस्टम द्वारा प्रदान की गई ध्वज सेवा के रूप में देखना नहीं है। एक संकेतित घटना को सेट ध्वज के रूप में देखा जा सकता है, दूसरी तरफ एक अनजान घटना को अनसेट ध्वज के रूप में देखा जा सकता है।

झंडे के आधार पर एक निर्माता/उपभोक्ता धागे की प्रणाली को लागू करने के लिए, आप आमतौर पर (मैं आगे तुल्यकालन तंत्र की उपेक्षा सरलता के लिए टिप्पणी) निम्नलिखित की तरह कुछ करना:

static volatile int flag = 0; 
static volatile char data = 'A'; 

// Some code to initialize the threads 

void producer() 
{ 
    while (1) 
    { 
     Sleep(1000); 
     data++; 
     flag = 1; 
    } 
} 

void consumer() 
{ 
    while (1) 
    { 
     /* Busy wait for the occurence of more data */ 
     while (!flag) 
     { 
      // wait for next data 
     } 

     flag = 0; 

     // process data 
    } 
} 

दुर्भाग्य से यह करने के लिए नेतृत्व करेंगे सीपीयू खपत को कम करने के लिए पेश किए गए Sleep कॉल के कारण व्यस्त प्रतीक्षा लूप या निष्पादन के अवांछित स्थगित में प्रोसेसर चक्रों का अपशिष्ट। दोनों अवांछित हैं।

कार्य सिंक्रनाइज़ेशन के साथ ऐसी समस्याओं से बचने के लिए, ऑपरेटिंग सिस्टम विभिन्न ध्वज जैसे तंत्र (जैसे विंडोज़ में ईवेंट) प्रदान करते हैं। घटनाओं के साथ, ध्वज को सेट करना और रीसेट करना ओएस द्वारा SetEvent/ResetEvent पर किया जाता है। ध्वज की जांच करने के लिए आप WaitForSingleObject का उपयोग कर सकते हैं। इस कॉल में एक कार्य को तब तक सोने की शक्ति है जब तक कि ईवेंट सिग्नल नहीं किया जाता है जो सीपीयू खपत के मामले में इष्टतम है।

यह कुछ इस तरह में ऊपर के उदाहरण में बदल जाता है: यह सोचने के लिए

static volatile char data = 'A'; 
static HANDLE newDataEvent = INVALID_HANDLE_VALUE; 

// Some code to initialize the threads and the newDataEvent handle 

void producer() 
{ 
    while (1) 
    { 
     Sleep(1000); 
     data++; 
     SetEvent(newDataEvent); 
    } 
} 

void consumer() 
{ 
    while (1) 
    { 
     if (WaitForSingleObject(newDataEvent, INFINITE) == WAIT_OBJECT_0) 
     { 
      ResetEvent(newDataEvent); 
      // process data 
     } 
    } 
} 
+0

बहुत अच्छी व्याख्या –

9

आसान तरीका: = "हरी बत्ती"

Green Light "संकेत" आप गाड़ी चला रहे हैं और आप एक हरे रंग की रोशनी देखते हैं जिसे आप नहीं रोकते हैं (यह थ्रेड एक घटना को देख रहा है, यह को संकेतित करता है और बिना अवरुद्ध किए ले जाता है)।

enter image description here यदि आप एक लाल रोशनी देखते हैं तो आप इसे रोकते हैं और इसके लिए हरे रंग के बनने की प्रतीक्षा करते हैं और फिर आगे बढ़ते हैं (ज्ञान में सुरक्षित अन्य धागे अब सभी संकेत नहीं हैं, इस प्रकार प्रतीक्षा कर रहे हैं या उनकी प्रतीक्षा करेंगे ... लाल रोशनी!)

संबंधित मुद्दे