मैं सी ++ 0x समर्थन के साथ प्रयोग कर रहा हूं और एक समस्या है, मुझे लगता है कि वहां नहीं होना चाहिए। या तो मैं इस विषय को समझ नहीं पा रहा हूं या जीसीसी में एक बग है।मेमोरी ऑर्डरिंग मुद्दे
मेरे पास निम्न कोड है, प्रारंभ में x
और y
बराबर हैं। थ्रेड 1 हमेशा पहले x
बढ़ाता है और फिर y
बढ़ाता है। दोनों परमाणु पूर्णांक मान हैं, इसलिए वृद्धि में कोई समस्या नहीं है। थ्रेड 2 जांच रहा है कि x
y
से कम है और यदि ऐसा है तो एक त्रुटि संदेश प्रदर्शित करता है।
यह कोड कभी-कभी विफल रहता है, लेकिन क्यों? यहां मुद्दा शायद मेमोरी रीडरिंग है, लेकिन सभी परमाणु संचालन अनुक्रमिक रूप से डिफ़ॉल्ट रूप से सुसंगत हैं और मैंने स्पष्ट रूप से उन किसी भी परिचालन में आराम नहीं किया है। मैं इस कोड को x86 पर संकलित कर रहा हूं, जहां तक मुझे पता है कि कोई ऑर्डरिंग समस्या नहीं होनी चाहिए। क्या आप कृपया बता सकते हैं कि समस्या क्या है?
#include <iostream>
#include <atomic>
#include <thread>
std::atomic_int x;
std::atomic_int y;
void f1()
{
while (true)
{
++x;
++y;
}
}
void f2()
{
while (true)
{
if (x < y)
{
std::cout << "error" << std::endl;
}
}
}
int main()
{
x = 0;
y = 0;
std::thread t1(f1);
std::thread t2(f2);
t1.join();
t2.join();
}
परिणाम here देखा जा सकता है।
असल में यह सी ++ 0x का प्रयोगात्मक कार्यान्वयन है, इसलिए दूसरा संभव है, लेकिन मेरा मानना है कि पहला व्यक्ति अधिक संभावना है: पी – confucius
ऊपर पोस्ट किया गया कोड हमेशा "त्रुटि", ('x' हमेशा 'y' से अधिक या बराबर होगा) क्या आप यही चाहते थे? – Paul
क्यों (x
confucius