2012-09-09 24 views
7

क्या यह कोड थ्रेडसेफ है? क्या मुझे फ़ंक्शन सिग में अस्थिर होना चाहिए? (उदा: void Unlock() volatile {v=0;}) यदि यह नहीं है कि मैं यह थ्रेडसेफ कैसे बना सकता हूं?क्या यह सरल (परमाणु) ताला धागा सुरक्षित है?

class SimpleLock { 
    std::atomic<int> v; 
public: 
    bool try_lock() { int z=0; return v.compare_exchange_strong(z, 1); } 
    void lock() { while(try_lock()==false) std::this_thread::yield(); } 
    void unlock() {v=0;} 
}; 
+0

बस ध्यान रखें कि यह खिलौना कोड है और किसी भी प्रकार के वास्तविक एप्लिकेशन में इसका उपयोग नहीं किया जाना चाहिए। उचित ताले की तुलना में प्रदर्शन भयानक होगा। (सिर्फ एक उदाहरण के रूप में, कल्पना अगर कोई अन्य धागा करने के लिए और एक धागा 'बुला lock' एक धागा है कि ताला धारण के रूप में एक ही शारीरिक कोर में runing है उपज के लिए है। आउच!) –

उत्तर

8

हाँ, यह धागा सुरक्षित है, हालांकि आप TryLock करने के लिए Lock नाम बदलने सकता है आप एक पाश में कैस बुला नहीं कर रहे हैं के बाद से जब तक यह सफल होता है है। परंपरागत रूप से Lock संचालन सफल होने तक अवरुद्ध होना चाहिए।

volatile के बारे में, std::atomic की the docs निर्दिष्ट (= ऑपरेटर के बारे में):

atomically परमाणु चर के लिए एक मूल्य टी प्रदान करती है। स्टोर (वांछित) के बराबर।

फिर store के बारे में:

शून्य की दुकान (टी वांछित, memory_order = std :: memory_order_seq_cst);

तब के बारे में memory_order = std::memory_order_seq_cst:

  • कोई लेखक धागा में लिखते हैं परमाणु दुकान पाठक सूत्र में
  • नहीं पढ़ता के बाद पुनर्क्रमित किया जा सकता है परमाणु भार से पहले पुनर्क्रमित जा सकता है।
  • सिंक्रनाइज़ेशन सभी परमाणु संचालन के बीच स्थापित किया गया है टैग की गईं std :: memory_order_seq_cst। ऐसे परमाणु ऑपरेशन का उपयोग करने वाले सभी थ्रेड मेमोरी एक्सेस के समान क्रम को देखते हैं।

तो नहीं, आपको यहां volatile की आवश्यकता नहीं है। ,

निष्पादन की एक धागा के भीतर सभी अस्थिर वस्तुओं नहीं होने की गारंटी कर रहे हैं करने के लिए तक पहुँचता है (रीड और राईट): इसके अतिरिक्त, volatile ऊपर वाले की तुलना में कमजोर की गारंटी देता है (वास्तव में, volatile सी में ज्यादातर बेकार है ++) है प्रत्येक अन्य, लेकिन इस आदेश के पुनर्क्रमित सापेक्ष एक और धागा द्वारा पालन किए जाने वाले इसकी गारंटी नहीं है, के बाद से अस्थिर पहुँच अंतर-धागा तुल्यकालन स्थापित नहीं करता।

+0

सही। अब क्या आपको कोई विचार है कि यह 'बूल TryLock() अस्थिर' होना चाहिए या नहीं? –

+0

आप यह उन्हें 'bool try_lock()' और 'शून्य अनलॉक()' कॉल करने के लिए भी बेहतर मानक पुस्तकालय के साथ इस लॉक का उपयोग करना चाहते हैं तो। – kennytm

+0

@ acidzombie24: मेरा संपादन देखें। – Tudor