मेरे पास एक चर int foo
है जो दो धागे से उपयोग किया जाता है। मान लीजिए कि मेरे पास कोई रेस-कंडीशन समस्या नहीं है (एक्सेस म्यूटेक्स द्वारा संरक्षित है, सभी परिचालन परमाणु हैं, या दौड़ की स्थिति से बचाने के लिए जो भी अन्य तरीका है), अभी भी "रजिस्टर कैशिंग" का मुद्दा है (बेहतर नाम की कमी के लिए) , जहां संकलक मान सकते हैं कि यदि चर के बीच में लिखा जा रहा बिना दो बार पढ़ रहा है, यह एक ही मूल्य है, और इसलिए की तरह दूर बातें "अनुकूलन" हो सकता है:थ्रेड के बीच परिवर्तनीय सिंक करने के लिए 'अस्थिर'
while(foo) { // <-may be optimized to if(foo) while(1)
do-something-that-doesn't-involve-foo;
}
या
if(foo) // becomes something like (my assembly is very rusty): mov ebx, [foo]; cmp ebx, 0; jz label;
do-something-that-doesn't-involve-foo;
do-something-else-that-doesn't-involve-foo;
if(foo) // <-may be optimized to jz label2;
do-something;
foo
को volatile
के रूप में चिह्नित करते हुए इस समस्या को हल करते हैं? क्या एक थ्रेड से परिवर्तन अन्य धागे तक पहुंचने की गारंटी है?
यदि नहीं, तो ऐसा करने का दूसरा तरीका क्या है? मुझे लिनक्स/विंडोज (संभवतः अलग समाधान) के लिए समाधान की आवश्यकता है, कोई सी ++ 11 नहीं।
मैं मानक से एक उद्धरण देख रहा हूं कि आप सी ++ में थ्रेड के लिए अस्थिरता का उपयोग नहीं करना चाहते हैं, मैं इसे – aaronman
http: // stackoverflow ढूंढने की कोशिश करूंगा।कॉम/प्रश्न/4557979/जब-से-उपयोग-अस्थिर-साथ-बहु-थ्रेडिंग –
यहां समस्या यह है कि "मुझे लगता है कि मेरे पास कोई रेस-हालत समस्या नहीं है"। यह एक ** मनोरंजक ** धारणा है। –