2010-05-17 13 views
5

मैं वर्तमान में एक चर के थ्रेड-सुरक्षित पहुंच के लिए निम्न कोड का उपयोग कर रहा हूं।थ्रेड-सुरक्षित प्राप्त करें (एक्सेसर विधि)

int gnVariable; 

void getVariableValue(int *pnValue) 
{ 
    acquireLock(); //Acquires the protection mechanism 
    *pnValue = gnVariable; 
    releaseLock(); //Releasing the protection mechanism 
} 

मैं एक और अधिक उपयोगकर्ता के अनुकूल करने के लिए अपने एपीआई हस्ताक्षर परिवर्तन करना चाहते हैं

int getVariableValue(void); 

मैं समारोह कैसे पुनर्लेखन करना चाहिए - एपीआई के उपयोगकर्ताओं के बारे में परेशान करने के लिए नहीं है ऐसा है कि विवरण लॉक/अनलॉक करना?

+0

मुझे आपका प्रश्न नहीं मिला है। आपके प्रस्तावित एपीआई का कोई भी संस्करण लॉकिंग विवरण का खुलासा नहीं करता है। – zvrba

+0

यदि दूसरे संस्करण में बदल दिया गया है - int getVariable (शून्य) -, एपीआई के उपयोगकर्ता को सैमफोर मैन्युअल रूप से रिलीज़/अनलॉक करना होगा। यदि आप ऐसा नहीं करते हैं जो सैमुअल और नवीन ने – sonofdelphi

उत्तर

9

चूंकि आपने विकल्प के रूप में सी ++ दिया है, तो आप म्यूटेक्स लॉक/अनलॉक को लपेट सकते हैं। तो आप मान सकते हैं सीधे:

class lock_wrapper 
{ 
public: 
    lock_wrapper() 
    { 
     acquireLock(); 
    } 
    ~lock_wrapper() 
    { 
     releaseLock(); 
    } 
}; 

int getVariableValue() 
{ 
    lock_wrapper lw; 
    return gnVariable; 
} 

यह भी काम में आ जाएगा अगर आप कभी भी/एक ताला कर कोड है कि एक अपवाद फेंक कर सकते हैं चारों ओर अनलॉक करना होगा।

+0

सी में ऐसा करने के लिए कोई विचार? – sonofdelphi

+1

मैं इसके लिए गिनती सेमफोर का उपयोग करता था। कुछ आरटीओएस में सेमफोरों की गिनती GetValue() ऑपरेशन का समर्थन करती है, जो परमाणु रूप से संचालित होती है। – sonofdelphi

+0

@sonofdelphi - सी के लिए, आपको तकनीक के जवाब से तकनीक का उपयोग करना चाहिए। –

8

आप स्थानीय चर की प्रतिलिपि वापस कर देते हैं। कुछ की तरह:

int getVariableValue(void) 
{ 
    int local= 0; 
    acquireLock(); 
    local = gnVariable; 
    releaseLock(); 
    return local; 
} 

एक तरफ ध्यान दें के रूप में, यह बजाय acquireLock और releaseLock तरीकों लॉक करने के लिए RAII सिद्धांत बेहतर है।

+0

का सुझाव दिया है तो स्थानीय प्रति कुछ हद तक सुरुचिपूर्ण लगती है। :) कोई और नहीं? – sonofdelphi

+0

@sonofdelphi: @R सैमुअल Klatchko एक बेहतर समाधान है। मैं सिर्फ यह दिखाना चाहता था कि स्थानीय प्रति का उपयोग करके इसे कैसे किया जाए। – Naveen

+2

@sonofdelphi: स्थानीय चर को एक सभ्य कंपाइलर द्वारा अनुकूलित किया जाना चाहिए - यह 'gnVariable' को सीधे वापसी मूल्य स्थान में कॉपी करेगा। – caf

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