माइक्रोसॉफ्ट विजुअल सी ++ में मैं एक void *
पैरामीटर के साथ फ़ंक्शन शुरू करके थ्रेड बनाने के लिए CreateThread() को कॉल कर सकता हूं। मैं एक पैरामीटर को उस पैरामीटर के रूप में एक पॉइंटर पास करता हूं, और मुझे लगता है कि बहुत सारे लोग भी ऐसा करते हैं।सी ++ - क्या थ्रेड को पास किया गया डेटा अस्थिर हो सकता है?
मेरा सवाल यह है कि अगर मैं अपनी संरचना में एक पॉइंटर पास कर रहा हूं तो मुझे कैसे पता चलेगा कि निर्माण सदस्यों को वास्तव में CreateThread() से पहले स्मृति में लिखा गया है या नहीं? क्या कोई गारंटी है कि उन्हें सिर्फ कैश नहीं किया जाएगा? उदाहरण के लिए:
struct bigapple { string color; int count; } apple;
apple.count = 1;
apple.color = "red";
hThread = CreateThread(NULL, 0, myfunction, &apple, 0, NULL);
DWORD WINAPI myfunction(void *param)
{
struct bigapple *myapple = (struct bigapple *)param;
// how do I know that apple's struct was actually written to memory before CreateThread?
cout << "Apple count: " << myapple->count << endl;
}
इस दोपहर जब मैं पढ़ रहा था मैं इस वेबसाइट और दूसरों है कि डेटा में गुजरता है कि एक धागा करने के लिए अस्थिर नहीं है पर Windows कोड का एक बहुत कुछ देखा था, और वहाँ किसी भी स्मृति होना प्रतीत नहीं होता है बाधा या कुछ और। मुझे सी ++ पता है या कम से कम पुराने संशोधन "थ्रेड जागरूक" नहीं हैं इसलिए मैं सोच रहा हूं कि शायद कुछ और कारण है। मेरा अनुमान है कि संकलक यह देखता है कि मैंने CreateThread() को कॉल में एक पॉइंटर & सेब पास कर दिया है, इसलिए यह कॉल से पहले apple
के सदस्यों को लिखना जानता है।
धन्यवाद
आप प्रिंट से पहले धागे से जुड़ें हैं ?! –
यह सी है, सी ++ नहीं ('संरचना बड़े आकार *'?) –