आपने गलत सुना है। यह अच्छी तरह से हो सकता है कि "i++"एक विशिष्ट संकलक और विशिष्ट प्रोसेसर वास्तुकला के लिए थ्रेड-सुरक्षित है, लेकिन यह मानकों में अनिवार्य नहीं है। वास्तव में, चूंकि मल्टी-थ्रेडिंग आईएसओ सी या सी ++ मानकों (ए) का हिस्सा नहीं है , आप जो कुछ भी सोचते हैं, उसके आधार पर आप थ्रेड-सुरक्षित होने पर विचार नहीं कर सकते।
यह काफी व्यवहार्य है कि ++iएक मनमाना अनुक्रम करने के लिए संकलन कर सकता है जैसे:
load r0,[i] ; load memory into reg 0
incr r0 ; increment reg 0
stor [i],r0 ; store reg 0 back to memory
जो मेरे (काल्पनिक) सीपीयू पर थ्रेड-सेफ नहीं होगा जिसमें मेमोरी-इन्क्रीमेंट निर्देश नहीं है। या यह स्मार्ट हो सकता है और इसे इसमें संकलित किया जा सकता है:
lock ; disable task switching (interrupts)
load r0,[i] ; load memory into reg 0
incr r0 ; increment reg 0
stor [i],r0 ; store reg 0 back to memory
unlock ; enable task switching (interrupts)
जहां lockनिष्क्रिय करता है और unlockबाधित करता है। लेकिन, फिर भी, यह एक आर्किटेक्चर में थ्रेड-सुरक्षित नहीं हो सकता है जिसमें मेमोरी साझा करने वाले इन सीपीयू में से एक से अधिक है ( lockकेवल एक सीपीयू के लिए इंटरप्ट को अक्षम कर सकता है)।
स्वयं भाषा (या इसके लिए पुस्तकालय, अगर यह भाषा में निर्मित नहीं है) थ्रेड-सुरक्षित निर्माण प्रदान करेगा और आपको उन लोगों की बजाय अपनी समझ (या संभवतः गलतफहमी) का उपयोग करना चाहिए जो मशीन कोड उत्पन्न होंगे।
जावा synchronizedऔर pthread_mutex_lock()(कुछ ऑपरेटिंग सिस्टम के तहत सी / सी ++ के लिए उपलब्ध) जैसी चीजें हैं जिन्हें आपको (ए) में देखने की आवश्यकता है ।
(ए) यह सवाल C11 और C ++ 11 मानकों को पूरा करने से पहले पूछा गया था। उन पुनरावृत्तियों ने अब परमाणु डेटा प्रकार (हालांकि वे, और सामान्य रूप से थ्रेड वैकल्पिक हैं, कम से कम सी में) सहित भाषा विनिर्देशों में थ्रेडिंग समर्थन शुरू किया है।