2012-06-19 12 views
26

मैं परमाणु बूलियन ध्वज के रूप में सी ++ std::atomic_flag का उपयोग कर रहा हूं। ध्वज को सही या गलत पर सेट करना कोई समस्या नहीं है, लेकिन इसे किसी भी मूल्य पर सेट किए बिना ध्वज की वर्तमान स्थिति को कैसे क्वेरी करें? मुझे पता है कि विधियां 'atomic_flag_clear' और 'atomic_flag_set' हैं। वे पिछले राज्य को वापस देते हैं लेकिन वर्तमान स्थिति को भी संशोधित करते हैं। फ्लैग स्टेटस को संशोधित किए बिना क्वेरी करने का कोई तरीका है या क्या मुझे पूर्ण 'std::atomic<bool>' का उपयोग करना है।सी ++ atomic_flag क्वेरी स्थिति

+1

ऐसा प्रतीत होता है कि इसका एकमात्र उपयोग लॉक प्राप्त करने का साधन होना है। आप एक 'std :: atomic_flag' का उपयोग लॉक के रूप में कर सकते हैं जिसे आप किसी साझा संसाधन तक पहुंचने से पहले हासिल कर सकते हैं, लेकिन यदि साझा संसाधन केवल' बूल 'है, जैसा आपने कहा था, तो आप अभी भी 'std :: परमाणु का उपयोग कर सकते हैं '। _Edit: _ या बल्कि std :: atomic_bool, यह देखकर कि वे आपके लिए एक विशेषज्ञ की परेशानी के लिए कैसे गए हैं! – Rook

+5

आप वर्तमान स्थिति को तब तक नहीं जानते जब तक कि आप सही अधिग्रहण/रिलीज सेमेन्टिक्स का उपयोग नहीं करते हैं (यानी इसे 'atomic_flag_set' के साथ लॉक करने का प्रयास करें, और फिर केवल तभी सामान करें जब आपने वास्तव में मूल्य बदल दिया हो)। बस इसे पढ़ना केवल आपको बताएगा कि जब आप इसे पढ़ते हैं तो मूल्य क्या था, और यह तुरंत बाद में बदल सकता है। –

+0

@ माइक: क्या वास्तव में यह मायने रखता है? लगता है कि सभी ओपी चाहता है कि एक परमाणु पढ़ने की क्षमता है और आदेशित पढ़ने और लिखने की कुछ धारणा है। – Rook

उत्तर

39

आप इसे के मान को true पर सेट किए बिना पढ़ नहीं सकते हैं। यह डिजाइन द्वारा है। यह एक बुलियन वैरिएबल नहीं है (हमारे पास std::atomic<bool> है), लेकिन एक न्यूनतम ध्वज जिसे सी ++ 11 का समर्थन करने वाले सभी आर्किटेक्चर पर लॉक फ्री की गारंटी है।

कुछ प्लेटफार्मों पर केवल परमाणु निर्देश विनिमय निर्देश हैं। ऐसे प्लेटफार्मों पर, std::atomic_flag::test_and_set()exchange var,1 और clear()exchange var,0 के साथ कार्यान्वित किया जा सकता है, लेकिन मूल्य पढ़ने के लिए कोई परमाणु निर्देश नहीं है।

तो, यदि आप इसे बदलने के बिना मूल्य को पढ़ना चाहते हैं, तो आपको std::atomic<bool> की आवश्यकता है।

+0

बस अपनी पुस्तक उद्धृत करना चाहता था .... – haohaolee

+0

क्या होगा यदि मैं केवल डीबगिंग उद्देश्य के लिए अपना मूल्य प्रिंट करना चाहता हूं, तो मुझे वास्तव में परवाह नहीं है कि यह * विशेष * परमाणु परमाणु है? अब मैं इसके लिए '.__ वैल' तत्व का उपयोग करता हूं, लेकिन यह जीसीसी के कुछ संस्करणों में त्रुटि देता है (सही मायने में मुझे लगता है) – user1273684

+0

आप बिना किसी उद्देश्य के किसी भी उद्देश्य के लिए 'std :: atomic_flag' के मान को वैध रूप से पढ़ नहीं सकते यह। यदि आप इसे पढ़ना चाहते हैं (यहां तक ​​कि printf डिबगिंग के लिए), तो आपको 'std :: atomic ' –

12

आप atomic_flag उपयोग करने के लिए निर्धारित करने के लिए एक धागा बाहर निकलने चाहिए चाहते हैं, आप इसे इस तरह कर सकते हैं:

प्रारंभ:

std::atomic_flag keep_running = ATOMIC_FLAG_INIT; 
keep_running.test_and_set(); 

थ्रेड पाश:

while (keep_running.test_and_set()) { 
    // do thread stuff 
} 

जब आप थ्रेड से बाहर निकलना चाहते हैं:

keep_running.clear(); 
संबंधित मुद्दे