के साथ लिखता है मैं खुद को बहुप्रचारित प्रोग्रामिंग के बारे में एक उलझन में गड़बड़ कर चुका हूं और उम्मीद कर रहा था कि कोई मेरे पास आ सकता है और मुझे कुछ समझ में आ सकता है।परमाणु 64 बिट जीसीसी
काफी पढ़ने के बाद, मुझे समझ में आ गया है कि मुझे 64 बिट सिस्टम पर परमाणु रूप से 64 बिट int का मान सेट करने में सक्षम होना चाहिए।
मुझे इस पढ़ने में बहुत कुछ मुश्किल पाया गया, इसलिए सोचा कि मैं इसे सत्यापित करने के लिए परीक्षण करने का प्रयास करूंगा।
bool switcher = false;
while(true)
{
if (switcher)
foo = a;
else
foo = b;
switcher = !switcher;
}
एक और धागा और जो foo
का मूल्य की जाँच करेगा:: मैं a = 1844674407370955161;
और b = 1144644202170355111;
सेट
while (true)
{
__uint64_t blah = foo;
if ((blah != a) && (blah != b))
{
cout << "Not atomic! " << blah << endl;
}
}
तो मैं एक साधारण जो दो मानों में से एक में एक चर सेट होगा एक धागे से कार्यक्रम में लिखा था । मैं इस कार्यक्रम को चलाता हूं और मुझे आउटपुट चेतावनी नहीं देता है कि blah
a
या b
नहीं है।
बढ़िया है, लगता है कि यह शायद एक परमाणु लिखने है ... लेकिन फिर, मैं पहली बार धागा सीधे a
और b
स्थापित करने के लिए, की तरह इतना बदल दिया है: अचानक
bool switcher = false;
while(true)
{
if (switcher)
foo = 1844674407370955161;
else
foo = 1144644202170355111;
switcher = !switcher;
}
मैं फिर से चलाने के लिए, और:
Not atomic! 1144644203261303193
Not atomic! 1844674406280007079
Not atomic! 1144644203261303193
Not atomic! 1844674406280007079
क्या बदल गया है? किसी भी तरह से मैं foo
पर बड़ी संख्या में असाइन कर रहा हूं - क्या संकलक निरंतर संख्या को अलग-अलग संभालता है, या क्या मैंने सबकुछ गलत समझा है?
धन्यवाद!
1: Intel CPU documentation, section 8.1, Guaranteed Atomic Operations
क्या संकलन करते समय आपको कोई चेतावनी मिली? – Nim
मुझे नहीं लगता कि यह अपराधी है, लेकिन शाब्दिकों के पास डिफ़ॉल्ट रूप से int प्रकार है, इसलिए आप 1844674407370955161ULL और 1144644202170355111ULL को अक्षर के रूप में चाहते हैं। – etarion
निम, संकलन करते समय कोई चेतावनी नहीं है, और -वॉल – Frederik