2012-05-11 7 views
6

मैं एक भाग में इस देखा कि एक सहकर्मी का कोड में कहा जाता है कभी नहीं हो जाता है:जबकि (! अस्थिर) क्या करता है; कर?

volatile unsigned char vol_flag = 0; 
// ... 
while(!vol_flag); 

vol_flag हेडर फाइल में घोषित किया जाता है, लेकिन कभी नहीं बदला गया है। क्या मैं सही हूं कि यह एक अनंत लूप में लटकने वाले प्रोग्राम की ओर ले जाएगा? क्या इसका कोई रास्ता है?

+2

यह बहु-थ्रेडेड कोड में कुछ खराब स्पिन-लॉक की तरह दिखता है। –

+1

शायद यह डिबगिंग के लिए है? – animaonline

+2

इस तरह का कोड आमतौर पर माइक्रो नियंत्रकों के लिए कार्यक्रमों में पाया जाता है। – alexander

उत्तर

16

आमतौर पर इस तरह का एक कोड इंगित करता है कि vol_flag किसी बिंदु पर बाहरी बदलने की उम्मीद है। यहां, बाहरी का मतलब एक अलग थ्रेड, एक इंटरप्ट हैंडलर, हार्डवेयर का एक टुकड़ा (मेमोरी मैप किए गए आईओ के मामले में) आदि हो सकता है। यह पाश प्रभावी ढंग से बाहरी घटना के लिए इंतजार कर रहा है जो ध्वज को बदलता है।

volatile कीवर्ड प्रोग्रामर के लिए यह तथ्य व्यक्त करने का एक तरीका है कि कोड से स्पष्ट क्या है: अर्थात् लूप में ध्वज नहीं बदला जाता है। इस प्रकार, यह संकलक को अनुकूलन करने से रोकता है जो कोड के पीछे इरादे से समझौता कर सकता है। इसके बजाए, कंपाइलर को ध्वज के मूल्य को लाने के लिए स्मृति संदर्भ बनाने के लिए मजबूर होना पड़ता है।

ध्यान दें कि (विपरीत जावा में) volatile सी में/C++ स्थापित नहीं करता होता है-पहले संबंध और किसी भी आदेश या अस्थिर पहुँच भर में स्मृति संदर्भ की दृश्यता की गारंटी नहीं है। इसके अलावा, यह परिवर्तनीय संदर्भों की परमाणुता सुनिश्चित नहीं करता है। इस प्रकार, यह धागे के बीच संचार के लिए एक उपकरण नहीं है। विवरण के लिए this देखें।

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