मैं एंथनी विलियम्स "एक्शन में सी ++ कन्करेंसी" के माध्यम से और अध्याय 5, जो नए बहु सूत्रण अवगत स्मृति मॉडल और परमाणु संचालन के बारे में बात करती है में पढ़ रहा हूँ, और वह कहता है:क्या std :: atomic <std::string> उचित काम करता है?
आदेश के लिए
std::atomic<UDT>
उपयोग करने के लिए कुछ उपयोगकर्ता परिभाषितUDT
, इस प्रकार के पास त्रिभुज कॉपी असाइनमेंट ऑपरेटर होना चाहिए।
मैं यह समझ के रूप में, इसका मतलब है कि हम std::atomic<UDT>
उपयोग कर सकते हैं अगर सच निम्नलिखित रिटर्न:
std::is_trivially_copyable<UDT>::value
इस तर्क के आधार हम std::atomic
के लिए एक टेम्पलेट तर्क के रूप में std::string
उपयोग करने में सक्षम नहीं होना चाहिए और यह सही ढंग से काम करता है।
हालांकि, निम्नलिखित कोड को संकलित करता है और उम्मीद उत्पादन के साथ चलाता है:
#include <atomic>
#include <thread>
#include <iostream>
#include <string>
int main()
{
std::atomic<std::string> atomicString;
atomicString.store("TestString1");
std::cout << atomicString.load() << std::endl;
atomicString.store("TestString2");
std::cout << atomicString.load() << std::endl;
return 0;
}
इस अपरिभाषित व्यवहार का मामला जो सिर्फ अपेक्षा के अनुरूप व्यवहार करने के लिए होता है?
अग्रिम धन्यवाद!
आपका कंपाइलर (और stdlib का आपका कार्यान्वयन) क्या है? मैं इसे संकलक नहीं बना सकता [यहां] (http://coliru.stacked-crooked.com/view?id=0ce3b66093e9a0a59d5179429373eea7-e54ee7a04e4b807da0930236d4cc94dc), और वास्तव में मैं –
@AndyProwl की अपेक्षा कर रहा था, मैं वीएस 2012 का उपयोग कर रहा हूं पल, नवंबर सीटीपी के बिना। –
जैसा कि आप इसका उपयोग कर रहे हैं, मुझे कोई समस्या देखने की उम्मीद नहीं होगी। समस्या तब उत्पन्न होगी जब दो (या अधिक) थ्रेड एक ही स्ट्रिंग को एक ही समय में संशोधित करने का प्रयास कर रहे थे। उस बिंदु पर, 'स्ट्रिंग' का गैर-तुच्छ ऑपरेटर समस्या का कारण बनना शुरू कर देगा। बस 'std :: atomic' में कुछ लपेटने से कोड को तोड़ने की संभावना नहीं है जो इसके बिना ठीक होगा। साथ ही, इसके नियमों का पालन किए बिना, यह कोड को मदद करने वाला नहीं है जो इसके बिना टूटा जाएगा। –