हाँ, यह धागा सुरक्षित है, हालांकि आप 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
सी में ज्यादातर बेकार है ++) है प्रत्येक अन्य, लेकिन इस आदेश के पुनर्क्रमित सापेक्ष एक और धागा द्वारा पालन किए जाने वाले इसकी गारंटी नहीं है, के बाद से अस्थिर पहुँच अंतर-धागा तुल्यकालन स्थापित नहीं करता।
बस ध्यान रखें कि यह खिलौना कोड है और किसी भी प्रकार के वास्तविक एप्लिकेशन में इसका उपयोग नहीं किया जाना चाहिए। उचित ताले की तुलना में प्रदर्शन भयानक होगा। (सिर्फ एक उदाहरण के रूप में, कल्पना अगर कोई अन्य धागा करने के लिए और एक धागा 'बुला lock' एक धागा है कि ताला धारण के रूप में एक ही शारीरिक कोर में runing है उपज के लिए है। आउच!) –