इस कोड के साथ प्रोग्राम कभी-कभी "2" प्रिंट क्यों करता है?सी ++ परमाणु पढ़ने/गलतफहमी
int main() {
std::atomic<int> a;
a = 0;
std::thread t1([&]{++a;});
std::thread t2([&]{a++;});
std::thread t3([&]{
a = a.load() + 1;
});
t1.join();
t2.join();
t3.join();
if (a != 3) {
std::cout << "a: " << a << std::endl;
}
}
मैं सोचा है std::atomic
गारंटी देता है कि सभी कार्यों atomically किया जाएगा इसलिए यहाँ लिख (incrementing) एक स्मृति बाधा का उपयोग करेगा और हम हमेशा 3
धागे काम के अंत में होगा। मैंने कोड की खोज की है और पता चला है कि समस्या धागा t3
है लेकिन मुझे समझ में नहीं आता कि यह गलत क्यों है।
'a = a.load() + 1' हालांकि केवल एक ऑपरेशन नहीं है। –
++ ए और ए ++ परमाणु रूप से नहीं किया जाता है। आप http://en.cppreference.com/w/cpp/atomic/atomic/fetch_add – Rush
@Rush पर इसके बारे में क्या देखना चाहते हैं? http://en.cppreference.com/w/cpp/atomic/atomic/operator_arith @JonathanPotter मुझे ऐसा लगा है, लेकिन कैसे फिर काम को बढ़ा देते है? मुझे लगता है कि इसे कम से कम एक पढ़ने की जरूरत है, है ना? तो 't3' में मैंने इसे अनुकरण करने की कोशिश की है लेकिन ऐसा लगता है कि यह गलत है क्योंकि @ पार्कयुंग-बाई ने कहा। तो मुझे लगता है कि समस्या यह है कि 't3' पुराने मान के साथ ओवरराइट करता है। –