যদিও কোনও মিউটেক্স অন্যান্য সমস্যাগুলি সমাধান করার জন্য ব্যবহার করা যেতে পারে, তবে তাদের বিদ্যমান প্রাথমিক কারণটি হ'ল পারস্পরিক বর্জন এবং তারপরে যা একটি রেসের শর্ত হিসাবে পরিচিত তা সমাধান করা। যখন দুটি (বা ততোধিক) থ্রেড বা প্রক্রিয়াগুলি একই ভেরিয়েবল একযোগে অ্যাক্সেস করার চেষ্টা করছে তখন আমাদের কাছে রেসের শর্তের সম্ভাবনা রয়েছে। নিম্নলিখিত কোড বিবেচনা করুন
//somewhere long ago, we have i declared as int
void my_concurrently_called_function()
{
i++;
}
এই ফাংশনটির ইন্টার্নালগুলি এত সহজ দেখাচ্ছে। এটি কেবল একটি বিবৃতি। তবে, একটি সাধারণ সিউডো-এসেম্বলি ভাষার সমতুল্য হতে পারে:
load i from memory into a register
add 1 to i
store i back into memory
যেহেতু সমতুল্য সমাবেশ-ভাষার নির্দেশাবলী সমস্তই i তে বর্ধিত ক্রিয়াকলাপ সম্পাদনের জন্য প্রয়োজনীয়, আমরা বলি যে আমি বৃদ্ধি করাই একটি নন-অ্যাটমিক অপারেশন। একটি পারমাণবিক অপারেশন হ'ল একটি নির্দেশিকা কার্যকর করা শুরু হওয়ার পরে বাধা না পাওয়ার নিশ্চয়তা সহ হার্ডওয়্যারটিতে সম্পূর্ণ করা যায়। আমি বৃদ্ধি 3 টি পরমাণু নির্দেশাবলীর একটি চেইন নিয়ে গঠিত। সমকালীন সিস্টেমে যেখানে বেশ কয়েকটি থ্রেড ফাংশনটিকে ডেকে দেখায়, কোনও থ্রেড ভুল সময়ে পড়ে বা লিখলে সমস্যা দেখা দেয়। কল্পনা করুন আমাদের একসাথে দুটি থ্রেড চলছে এবং একজন অন্যের সাথে সাথেই ফাংশনটি কল করে। আসুন আমরা এটাও বলে রাখি যে আমরা 0 থেকে শুরু করে এসেছি। এছাড়াও ধরে নিও যে আমাদের প্রচুর রেজিস্টার রয়েছে এবং দুটি থ্রেড সম্পূর্ণ আলাদা রেজিস্টার ব্যবহার করছে, সুতরাং কোনও সংঘর্ষ হবে না। এই ইভেন্টগুলির আসল সময় হতে পারে:
thread 1 load 0 into register from memory corresponding to i //register is currently 0
thread 1 add 1 to a register //register is now 1, but not memory is 0
thread 2 load 0 into register from memory corresponding to i
thread 2 add 1 to a register //register is now 1, but not memory is 0
thread 1 write register to memory //memory is now 1
thread 2 write register to memory //memory is now 1
যা ঘটেছে তা হল আমরা একই সাথে দুটি থ্রেড বাড়িয়েছি, আমাদের ফাংশনটি দু'বার কল হয়ে যায়, তবে ফলাফলটি সেই সত্যের সাথে অসামঞ্জস্যপূর্ণ। দেখে মনে হচ্ছে ফাংশনটি কেবল একবার ডাকা হয়েছিল। এটি কারণ মেশিন পর্যায়ে পারমাণবিকতা "ভাঙ্গা", যার অর্থ থ্রেডগুলি একে অপরকে বাধা দিতে পারে বা ভুল সময়ে এক সাথে কাজ করতে পারে।
এটি সমাধান করার জন্য আমাদের একটি প্রক্রিয়া দরকার। আমাদের উপরের নির্দেশাবলীতে কিছু ক্রম চাপিয়ে দেওয়া দরকার। একটি সাধারণ প্রক্রিয়া হ'ল একটি বাদে সমস্ত থ্রেড ব্লক করা। প্যাথ্রেড মিউটেক্স এই প্রক্রিয়াটি ব্যবহার করে।
যে কোনও থ্রেডে কোডের কয়েকটি লাইন কার্যকর করতে হবে যা একই সময়ে অন্যান্য থ্রেডের দ্বারা অনিরাপদভাবে ভাগ করা মানগুলিকে সংশোধন করতে পারে (তার স্ত্রীর সাথে কথা বলার জন্য ফোনটি ব্যবহার করে), প্রথমে একটি মিউটেক্সে একটি লক অর্জন করা উচিত। এইভাবে, যে কোনও থ্রেডে ভাগ করা ডেটা অ্যাক্সেসের প্রয়োজন তা অবশ্যই মুটেক্স লকটির মধ্য দিয়ে যেতে হবে। তবেই কোনও থ্রেড কোডটি কার্যকর করতে সক্ষম হবে। কোডের এই বিভাগটিকে একটি সমালোচনা বিভাগ বলা হয়।
থ্রেডটি সমালোচনামূলক বিভাগটি সম্পাদন করার পরে, এটি মুটেক্সে লকটি প্রকাশ করা উচিত যাতে অন্য থ্রেডটি মিউটেক্সে একটি লক অর্জন করতে পারে।
সত্যিকারের, শারীরিক বস্তুগুলিতে একচেটিয়া অ্যাক্সেসের জন্য মানুষ বিবেচনা করার সময় মিউটেক্স থাকার ধারণাটি কিছুটা অদ্ভুত বলে মনে হয় তবে প্রোগ্রামিং করার সময় আমাদের অবশ্যই উদ্দেশ্যমূলক হতে হবে। সাম্প্রতিক থ্রেড এবং প্রক্রিয়াগুলিতে আমাদের মতো সামাজিক ও সাংস্কৃতিক লালন-পালনের ব্যবস্থা নেই, তাই আমাদের অবশ্যই তাদের সুন্দরভাবে ডেটা ভাগ করতে বাধ্য করতে হবে।
প্রযুক্তিগতভাবে বলতে গেলে, একটি মিটেক্স কীভাবে কাজ করে? আমরা আগে বর্ণিত একই জাতি শর্তে ভোগে না? Pthread_mutex_lock () একটি ভেরিয়েবলের একটি সহজ বৃদ্ধি যে আরও কিছুটা জটিল নয়?
প্রযুক্তিগতভাবে বলতে গেলে, আমাদের সাহায্য করার জন্য আমাদের কিছু হার্ডওয়্যার সহায়তা প্রয়োজন। হার্ডওয়্যার ডিজাইনাররা আমাদের মেশিনের নির্দেশনা দেয় যা একাধিক কাজ করে তবে পরমাণু হওয়ার নিশ্চয়তা থাকে are এই জাতীয় নির্দেশের একটি সর্বোত্তম উদাহরণ হ'ল টেস্ট অ্যান্ড সেট (টিএএস)। কোনও উত্সটিতে একটি লক অর্জন করার চেষ্টা করার সময়, আমরা টিএএস ব্যবহার করতে পারি মেমরির কোনও মান 0 আছে কিনা তা পরীক্ষা করে দেখতে পারেন If এটি যদি হয় তবে আমাদের সংকেতটি হবে যে উত্সটি ব্যবহার হচ্ছে এবং আমরা কিছুই করি না (বা আরও সঠিকভাবে) , আমরা কিছু ব্যবস্থার দ্বারা অপেক্ষা করি A একটি pthreads mutex আমাদের অপারেটিং সিস্টেমের একটি বিশেষ কাতারে রাখবে এবং যখন সংস্থানটি উপলব্ধ হবে তখন আমাদের জানাবে D ডम्बर সিস্টেমগুলি আমাদের একটি কঠোর স্পিন লুপ করার প্রয়োজন হতে পারে, শর্তটি বারবার পরীক্ষা করে) । যদি মেমরির মান 0 না হয় তবে টিএএস অন্য নির্দেশাবলী ব্যবহার না করে 0 থেকে অন্য কিছুতে অবস্থান সেট করে। এটা ' আমাদের পারমাণবিকতা দেওয়ার জন্য দুটি সমাবেশ নির্দেশকে 1 এর সাথে সংযুক্ত করার মতো s সুতরাং, পরীক্ষার এবং মানটি পরিবর্তন করা (যদি পরিবর্তন যথাযথ হয়) একবার শুরু হয়ে গেলে বাধা দেওয়া যায় না। আমরা এই জাতীয় নির্দেশের উপরে মিটেক্সেস তৈরি করতে পারি।
দ্রষ্টব্য: কিছু বিভাগ পূর্ববর্তী উত্তরের অনুরূপ উপস্থিত হতে পারে। আমি সম্পাদনা করার জন্য তার আমন্ত্রণটি গ্রহণ করেছি, সে এটির মূল পদ্ধতিটিকেই পছন্দ করেছিল, তাই আমি যা ছিল তা রাখছি যা তার সামান্য কিছুটা কথা বলে age