एक "दौड़ की स्थिति" तब मौजूद होती है जब एक साझा संसाधन तक पहुंचने वाले मल्टीथ्रेडेड (या अन्यथा समानांतर) कोड इस तरह से ऐसा कर सकता है जिससे अप्रत्याशित परिणाम हो सकते हैं।
इस उदाहरण को लें:
for ( int i = 0; i < 10000000; i++ )
{
x = x + 1;
}
यदि आपके पास 5 धागे हैं जो एक साथ इस कोड को निष्पादित करते हैं, तो x WULULD का मूल्य 50,000,000 तक नहीं है। यह वास्तव में प्रत्येक रन के साथ अलग-अलग होगा।
ऐसा इसलिए है क्योंकि प्रत्येक थ्रेड के लिए x का मान बढ़ाने के लिए, उन्हें निम्नलिखित कार्य करने होंगे: (सरलीकृत, स्पष्ट रूप से)
X का मान पुनः प्राप्त करें
इस मान में 1 जोड़ें
इस मान को x में संग्रहीत करें
कोई भी धागा किसी भी समय इस प्रक्रिया में किसी भी चरण में हो सकता है, और साझा संसाधन शामिल होने पर वे एक दूसरे पर कदम रख सकते हैं। X की स्थिति को दूसरे थ्रेड द्वारा उस समय के दौरान बदला जा सकता है जब x पढ़ा जा रहा हो और जब वह वापस लिखा जाए।
मान लें कि एक थ्रेड x का मान प्राप्त करता है, लेकिन इसे अभी तक संग्रहीत नहीं किया है। एक और धागा भी x का समान मान निकाल सकता है (क्योंकि किसी भी धागे ने इसे अभी तक नहीं बदला है) और फिर वे दोनों एक ही मूल्य (x + 1) को वापस x में संग्रहीत कर रहे होंगे !
उदाहरण:
थ्रेड 1: x को पढ़ता है, मान 7 है
थ्रेड 1: 1 से x जोड़ें, मान अब 8 है
थ्रेड 2: x को पढ़ता है, मान 7 है
थ्रेड 1: स्टोर एक्स में 8
थ्रेड 2: 1 से x जोड़ता है, मान अब 8 है
धागा 2: स्टोर एक्स में 8
साझा संसाधन तक पहुँचने वाले कोड से पहले कुछ प्रकार के लॉकिंग तंत्र को नियोजित करके दौड़ की स्थितियों से बचा जा सकता है :
for ( int i = 0; i < 10000000; i++ )
{
//lock x
x = x + 1;
//unlock x
}
यहां, हर बार 50,000,000 के रूप में उत्तर निकलता है।
लॉकिंग के बारे में अधिक जानने के लिए: म्यूटेक्स, सेमाफोर, महत्वपूर्ण अनुभाग, साझा संसाधन।