मैं वैश्विक चर का उपयोग कर इंटर-थ्रेड संचार लागू कर रहा हूं।असाइनमेंट ऑपरेटर '=' परमाणु है?
//global var
volatile bool is_true = true;
//thread 1
void thread_1()
{
while(1){
int rint = rand() % 10;
if(is_true) {
cout << "thread_1: "<< rint <<endl; //thread_1 prints some stuff
if(rint == 3)
is_true = false; //here, tells thread_2 to start printing stuff
}
}
}
//thread 2
void thread_2()
{
while(1){
int rint = rand() % 10;
if(! is_true) { //if is_true == false
cout << "thread_1: "<< rint <<endl; //thread_2 prints some stuff
if(rint == 7) //7
is_true = true; //here, tells thread_1 to start printing stuff
}
}
}
int main()
{
HANDLE t1 = CreateThread(0,0, thread_1, 0,0,0);
HANDLE t2 = CreateThread(0,0, thread_2, 0,0,0);
Sleep(9999999);
return 0;
}
प्रश्न
उपरोक्त कोड में, मैं एक वैश्विक वर volatile bool is_true
का उपयोग thread_1 और thread_2 के बीच स्विच करने के लिए मुद्रण।
मुझे आश्चर्य है क्या यह असाइनमेंट ऑपरेशन का उपयोग करने के लिए थ्रेड-सुरक्षित है या नहीं?
मैं एक परमाणु विनिमय आदिम उपयोग करने के लिए पसंद करते हैं, लेकिन मैं एक परिदृश्य है, जिसमें आप एक समस्या मिल चाहता हूँ ... –
@KerrekSB, इस परिदृश्य बाहर काम नहीं कर सकते? खैर, मैंने इसे अपने प्रश्न का प्रदर्शन करने के लिए अभी सुधार किया है :) :) – Alcott
ठीक है, मेरा मतलब है लोड और स्टोर्स का एक अनुक्रम जो दोनों धागे को महत्वपूर्ण खंड में प्रवेश करने के लिए पर्याप्त रूप से टूटा जाएगा ... आमतौर पर ऐसा अनुक्रम प्रदर्शित करने में सक्षम होना चाहिए यह दिखाने के लिए कि क्यों कुछ कोड सही नहीं है। हालांकि, मैं इसे यहां नहीं देख सकता। मुझे अभी भी कोड पसंद नहीं है, लेकिन मैं साबित नहीं कर सकता कि क्यों। –