দুটি (বা আরও বেশি) থ্রেড একই সময়ে লক অর্জন করা সম্ভব নয়। উদাহরণস্বরূপ কয়েকটি ধরণের সিঙ্ক্রোনাইজেশন পদ্ধতি রয়েছে:
সক্রিয় অপেক্ষার - স্পিন লক
pseudocode:
1. while ( xchg(lock, 1) == 1); - entry protocole
এক্সসিএইচজি হ'ল পারমাণবিক ক্রিয়াকলাপের একটি উদাহরণ (x86 আর্কিটেকচারে বিদ্যমান) যা প্রথমে একটি "লক" ভেরিয়েবলের জন্য নতুন মান নির্ধারণ করে এবং তারপরে পুরানো মান প্রদান করে। পারমাণবিক অর্থ এটি বাধাগ্রস্ত হতে পারে না - উপরের উদাহরণে নতুন মান সেট করা এবং পুরানো ফিরে আসার মধ্যে। পারমাণবিক - নির্ণায়ক ফলাফল যাই হোক না কেন।
2. Your code
3. lock = 0; - exit protocol
লক যখন 0 এর সমান হয় তখন অন্য থ্রেড সমালোচনামূলক বিভাগে প্রবেশ করতে পারে - যখন লুপ শেষ হয়।
থ্রেড স্থগিতকরণ - উদাহরণস্বরূপ সেমফোর গণনা করা
দুই পারমাণবিক অপারেশন বিদ্যমান .Wait()
এবং .Signal()
এবং পূর্ণসংখ্যা পরিবর্তনশীল সেটিতে কল করতে দেয় আমরা আছে int currentValue
।
Wait():
if (currentValue > 0) currentValue -= 1;
else suspend current thread;
Signal():
If there exists thread suspended by semaphore wake up one of them
Else currentValue += 1;
এখন সমালোচনামূলক বিভাগ সমস্যা সমাধান করা সত্যিই সহজ:
pseudocode:
mySemaphore.Wait();
do some operations - critical section
mySemaphore.Signal();
সাধারণত আপনার প্রোগ্রামিং থ্রেড এপিআই আপনাকে সেমফোর সমালোচনামূলক বিভাগে সর্বাধিক একত্রে সুসংগত থ্রেড নির্দিষ্ট করার দক্ষতা দেয়। স্পষ্টতই মাল্টিথ্রেডেড সিস্টেমে আরও ধরণের সিঙ্ক্রোনাইজেশন রয়েছে (মিটেক্স, মনিটরস, বাইনারি সেমফোর ইত্যাদি) তবে তারা উপরের ধারণাগুলির উপর ভিত্তি করে। যে কেউ তর্ক করতে পারে যে থ্রেড স্থগিতকরণগুলি ব্যবহার করে সেগুলি সক্রিয় অপেক্ষার চেয়ে বেশি পছন্দ করা উচিত (সুতরাং সিপিইউ নষ্ট হয় না) - এটি সর্বদা সত্য নয়। যখন থ্রেড স্থগিত করা হচ্ছে - প্রসঙ্গ সুইচ নামে ব্যয়বহুল অপারেশন এটি স্থান করে নেয়। তবে অপেক্ষা করার সময়টি যখন কম থাকে তখন এটি যুক্তিযুক্ত (থ্রেডের সংখ্যা ores কোরগুলির সংখ্যা)।