একটি "রেস শর্ত" বিদ্যমান যখন মাল্টিথ্রেডেড (বা অন্যথায় সমান্তরাল) কোড যা একটি ভাগ করা সংস্থান অ্যাক্সেস করবে এমনভাবে এমনভাবে করতে পারে যাতে অপ্রত্যাশিত ফলাফল হতে পারে।
এই উদাহরণটি ধরুন:
for ( int i = 0; i < 10000000; i++ )
{
x = x + 1;
}
যদি আপনার 5 টি থ্রেড একবারে এই কোডটি কার্যকর করে থাকে তবে এক্স এর মান 50,000,000 না হওয়া পর্যন্ত শেষ হবে। এটি আসলে প্রতিটি রানের সাথে আলাদা হয়।
এটি কারণ, প্রতিটি থ্রেডের এক্সের মান বাড়ানোর জন্য তাদের নিম্নলিখিতটি করতে হবে: (সরল, স্পষ্টতই)
এক্স এর মান পুনরুদ্ধার করুন
এই মান 1 যোগ করুন
এই মানটি এক্সে সঞ্চয় করুন
যে কোনও থ্রেড যে কোনও সময় এই প্রক্রিয়াটির যে কোনও পদক্ষেপে থাকতে পারে এবং যখন একটি ভাগ করা সংস্থান জড়িত থাকে তখন তারা একে অপরের দিকে পদক্ষেপ নিতে পারে। X পড়ার সময় এবং কখন এটি আবার লেখা হয় সেই সময়ের মধ্যে এক্স এর স্থিতিটি অন্য থ্রেড দ্বারা পরিবর্তিত হতে পারে।
ধরা যাক একটি থ্রেড x এর মান পুনরুদ্ধার করে তবে এটি এখনও সংরক্ষণ করে না। অন্য একটি থ্রেডও একই মানের x এর পুনরুদ্ধার করতে পারে (কারণ কোনও থ্রেড এখনও এটি পরিবর্তন করে নি) এবং তারপরে তারা উভয়ই একই মান (x + 1) x এ ফিরে সংরক্ষণ করবে !
উদাহরণ:
থ্রেড 1: এক্স পড়ছে, মান 7
থ্রেড 1: 1 এ x যুক্ত করুন, মান এখন 8
থ্রেড 2: এক্স পড়ছে, মান 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 হিসাবে আসে।
লকিংয়ের বিষয়ে আরও তথ্যের জন্য: সন্ধান করুন: মিটেক্স, সেমফোর, সমালোচনা বিভাগ, ভাগ করা সংস্থান।