मैं Cygwin GCC का उपयोग कर रहा हूं और इस कोड को चलाता हूं:
#include <iostream>
#include <thread>
#include <vector>
using namespace std;
unsigned u = 0;
void foo()
{
u++;
}
int main()
{
vector<thread> threads;
for(int i = 0; i < 1000; i++) {
threads.push_back (thread (foo));
}
for (auto& t : threads) t.join();
cout << u << endl;
return 0;
}
रेखा के साथ संकलित g++ -Wall -fexceptions -g -std=c++14 -c main.cpp -o main.o
:।
यह 1000 प्रिंट करता है, जो सही है। हालाँकि, मैंने थ्रेड के कारण कम संख्या की अपेक्षा की थी, जो पहले से बढ़े हुए मान को अधिलेखित कर रहा था। यह कोड पारस्परिक पहुंच से ग्रस्त क्यों नहीं है?
मेरी परीक्षण मशीन में 4 कोर हैं, और मुझे उस कार्यक्रम पर कोई प्रतिबंध नहीं है जिसे मैं जानता हूं।
समस्या तब बनी रहती है जब साझा की गई सामग्री को foo
कुछ अधिक जटिल के साथ प्रतिस्थापित किया जाता है , जैसे
if (u % 3 == 0) {
u += 4;
} else {
u -= 1;
}
while true; do res=$(./a.out); if [[ $res != 1000 ]]; then echo $res; break; fi; done;
मेरे सिस्टम पर 999 या 998 प्रिंट जैसा कुछ ।
u
स्मृति में वापस लिखने के लिए जाता है । सीपीयू वास्तव में नोटिस जैसी आश्चर्यजनक चीजें करेगाu
जो सीपीयू के कैश में मेमोरी लाइन नहीं है और यह वेतन वृद्धि ऑपरेशन को फिर से शुरू करेगा। यही कारण है कि x86 से अन्य आर्किटेक्चर में जाना एक आंख खोलने का अनुभव हो सकता है!