2013-04-01 6 views
35

मैं std::atomic_bool का उपयोग करना चाहता हूं क्योंकि मैं एक बुलियन चाहता हूं जिसे विभिन्न धागे से एक्सेस किया जाना चाहिए।std :: atomic_bool शुरू करना?

यह static सदस्य परिवर्तनीय है। समस्या यह है कि मैं इसे पहले राज्य के रूप में false के साथ प्रारंभ करना चाहता हूं। आम तौर पर मैं ऐसा करना होगा: std::atomic_bool World::mStopEvent = false;

लेकिन समस्याओं होने के लिए है कि यह false निर्माता के रूप में नहीं ले करता है लगता है। तो मुझे इस तरह के एक चर को शुरू करने के लिए कैसे माना जाता है? मैं वी.एस. 2012

उत्तर

36

यह एक known issue in Visual Studio 2012 (known as VC11) है, तो आप मौजूदा कनेक्ट आइटम पर वोट चाहिए, ताकि माइक्रोसॉफ्ट जानता है के रूप में वे ठीक टाल दिया है इसे और अधिक लोगों को प्रभावित करता है।

Hi,

Thanks for reporting this bug. I'm Microsoft's maintainer of the STL, and I wanted to let you know that while this bug remains active in our database, it won't be fixed in VC11 RTM (VS 2012 RTM). All bugs are important to us, but some are more severe than others and rise to the top of our priority queue.

I'm copying-and-pasting this response across all of the STL's active Connect bugs, but the following terse comments apply specifically to your bug:

  • Yep, we're missing these constructors on atomic_bool , atomic_int , etc. (atomic<bool> , atomic<int> , etc. have them). 29.5 [atomics.types.generic]/7 says "There shall be named types corresponding to the integral specializations of atomic, as specified in Table 145, and a named type atomic_bool corresponding to the specified atomic<bool> . Each named type is a either typedef to the corresponding specialization or a base class of the corresponding specialization. If it is a base class, it shall support the same member functions as the corresponding specialization." which makes me really want to use typedefs (1 type is always simpler than 2 types), but I'll need to see if that would introduce any other issues.

I can't promise when we'll be able to resolve this bug, but we hope to do so as soon as possible (and I'll send another response when that happens) - our first opportunity will be the "out of band" release between VC11 and VC12 that Herb Sutter announced at the GoingNative 2012 conference.

Note: Connect doesn't notify me about comments. If you have any further questions, please E-mail me.

Stephan T. Lavavej Senior Developer - Visual C++ Libraries [email protected]

मूल रूप से, आप अब के लिए std::atomic<T> का उपयोग करना होगा।

2

उपयोग कर रहा हूँ कैसे के बारे में:

std::atomic_bool World::mStopEvent(false); 
+3

एक ही त्रुटि: 'त्रुटि C2440: 'आरंभ': से परिवर्तित नहीं कर सकते ' bool 'to' std :: atomic_bool ' 1> कोई कन्स्ट्रक्टर स्रोत प्रकार नहीं ले सकता है, या कन्स्ट्रक्टर ओवरलोड रिज़ॉल्यूशन अस्पष्ट था – Sapd

20

समस्या:

आप कॉपी-प्रारंभ उपयोग नहीं कर सकते, क्योंकि std::atomic_bool नहीं है कॉपी-constructible:

std::atomic_bool World::mStopEvent = std::atomic_bool(false); // ERROR! 
:

std::atomic_bool World::mStopEvent = false; // ERROR! 

वास्तव में, इसके बाद के संस्करण के बराबर है

हालांकि, आप प्रत्यक्ष-प्रारंभिक का उपयोग कर सकते हैं zation:

std::atomic_bool World::mStopEvent(false); 

अपनी इच्छा पर, आप कोष्ठकों के बजाय ब्रेसिज़ उपयोग करने के लिए चुन सकते हैं:

std::atomic_bool World::mStopEvent{false}; 

बग:

जबकि कॉपी-आरंभीकरण कोई फर्क नहीं पड़ता गैर कानूनी है कि तुम क्या संकलक चुनें, ऐसा लगता है कि वीसी 11 के साथ भेजे गए मानक लाइब्रेरी के कार्यान्वयन में एक बग है जो आपको प्रत्यक्ष-प्रारंभिक प्रदर्शन करने की अनुमति नहीं देगा।

So how I am supposed to initialize such a variable?

वैकल्पिक हल: करने से पहले की स्थापना की और परमाणु बूलियन ध्वज का मान, लेकिन नहीं - - क्रमशः

एक संभव समाधान के रूप में आप स्थिर गेटर/सेटर रैपर कि की एक जोड़ी प्रदान कर सकते हैं अब बजाय 0 तक पहुँचने का

#include <atomic> 
#include <mutex> 

struct World 
{ 
    static bool is_stop_event_set() 
    { 
     std::call_once(mStopEventInitFlag, []() { mStopEvent = false; }); 
     return mStopEvent; 
    } 

    static void set_stop_event(bool value) 
    { 
     std::call_once(mStopEventInitFlag, [value]() { mStopEvent = value; }); 
     mStopEvent = value; 
    } 

    static std::atomic_bool mStopEvent; 
    static std::once_flag mStopEventInitFlag; 
}; 

std::atomic_bool World::mStopEvent; 
std::once_flag World::mStopEventInitFlag; 

: यकीन है कि यह कम से कम एक बार और नहीं शुरू कर दिया गया और अधिक एक बार एक धागा सुरक्षित तरीके से वांछित प्रारंभिक मूल्य की तुलना में (आप इस आलसी आरंभीकरण किसी तरह का विचार कर सकते हैं)सीधे, अपने मूल्य is_stop_event_set() समारोह के माध्यम से पढ़ा जाएगा:

#include <iostream> 

int main() 
{ 
    std::cout << World::is_stop_event_set(); // Will return false 
} 
+0

हां, प्रत्यक्ष-प्रारंभिक कार्य भी काम नहीं करता है :( – Sapd

+1

@Sapd: मैंने एक वर्कअराउंड प्रदान करने की कोशिश की, उम्मीद है कि यह –

+0

मदद करता है हाँ धन्यवाद, मैं वैसे भी एक्सेसर्स का उपयोग करना चाहता था। दयालुता कि इस उपरि की आवश्यकता है। – Sapd

16

आज़माएं:

atomic_bool my_bool = ATOMIC_VAR_INIT(false); 

http://en.cppreference.com/w/cpp/atomic/ATOMIC_VAR_INIT

+1

मुझे लगता है कि यह सबसे अच्छा जवाब है, क्योंकि यह सबसे कम तरीके से और बिना किसी ओवरहेड में समस्या हल करता है। यह समाधान क्रॉसप्लेटफार्म भी है, मैंने इसे वीएस और एक्सकोड में संकलित किया। – GuidC0DE

+0

हां, मैक ओएस एक्स पर क्लैंग के साथ संकलित, लेकिन चेतावनी के साथ "स्केलर प्रारंभकर्ता [-Wbraced-scalar-init]" के आसपास ब्रेसिज़। बेशक अगर आप इसे सक्षम करते हैं। – dismine

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