উত্তর:
lock
একটি সংকলক কীওয়ার্ড, প্রকৃত শ্রেণি বা বস্তু নয়। এটি Monitor
ক্লাসের কার্যকারিতার চারপাশে একটি মোড়ক Monitor
এবং সাধারণ ক্ষেত্রে এটির সাথে কাজ করা আরও সহজ করার জন্য ডিজাইন করা হয়েছে ।
Monitor
(এবং lock
শব্দ), হিসাবে Darin বলেন অবধি সীমিত AppDomain
। মূলত কারণ "মজাদার অবস্থান" পরিচালনা করতে এবং পরিচয় বজায় রাখতে একটি স্মৃতি ঠিকানার (একটি তাত্ক্ষণিক বস্তুর আকারে) একটি রেফারেন্স প্রয়োজনMonitor
Mutex
অন্যদিকে, একটি অপারেটিং সিস্টেম কনস্ট্রাক্ট কাছাকাছি একটি নেট মোড়কের, এবং সিস্টেম-ব্যাপী সিঙ্ক্রোনাইজেশন ব্যবহার করা যেতে পারে, স্ট্রিং ব্যবহার করে ডেটা এটির শনাক্তকারীর যেমন (ডাটা একটি পয়েন্টার পরিবর্তে)। দুটি মুটিেক্স যা দুটি সম্পূর্ণ পৃথক পৃথক মেমরি ঠিকানার মধ্যে দুটি স্ট্রিংকে উল্লেখ করে তবে একই ডেটা থাকা আসলে একই অপারেটিং-সিস্টেম মিটেক্স ব্যবহার করবে।
এ হয় প্রক্রিয়াতে স্থানীয় বা সিস্টেম-ব্যাপী স্থানীয়Mutex
হতে পারে । এমএসডিএন :
মিউটেক্সগুলি দুটি ধরণের হয়: স্থানীয় মিটেক্সেস, যা নামবিহীন এবং নামকরণ করা হয়েছে মাইটেক্সেস। একটি স্থানীয় মিউটেক্স কেবলমাত্র আপনার প্রক্রিয়াতেই বিদ্যমান।
তদ্ব্যতীত, টার্মিনাল পরিষেবাদি সহ কোনও সিস্টেমে সিস্টেম-ব্যাপী মিটেক্স ব্যবহার করার সময় - একই পৃষ্ঠায় বিস্তারিত - একটি বিশেষ যত্ন নেওয়া উচিত।
মধ্যে পার্থক্য এক Mutex
এবং lock
যে Mutex
একটি সদ্ব্যবহার কার্নেল পর্যায়ের কনস্ট্রাক্ট , তাই সিঙ্ক্রোনাইজেশন সবসময় অন্তত একটি ব্যবহারকারী স্পেস-কার্নেল স্থান রূপান্তর প্রয়োজন হবে।
lock
- এটি Monitor
ক্লাসের সত্যই শর্টকাট , অন্যদিকে কার্নেল সংস্থানগুলি বরাদ্দ করা এবং কার্নেল কোডে স্থানান্তর এড়াতে চেষ্টা করে (এবং এইভাবে ঝুঁকির ও দ্রুততর হয় - যদি কোনও উইনাপিআইয়ের মতো দেখতে পাওয়া যায় তবে এটি তৈরি হবে)CriticalSection
)।
অন্য পার্থক্যটি অন্যরা কী দেখায়: একটি নামক Mutex
ক্যান প্রক্রিয়া জুড়ে ব্যবহার করা পারে।
কারও কারও বিশেষ প্রয়োজন বা প্রসেস জুড়ে সুসংগতকরণের প্রয়োজন না থাকলে এটি lock
(ওরফে আটকে থাকা) আরও ভালMonitor
) ˛
অন্যান্য বেশ কয়েকটি "গৌণ" পার্থক্য রয়েছে, যেমন বিসর্জন কীভাবে পরিচালনা করা হয় ইত্যাদি etc.
একই সম্পর্কে 3.5 ReaderWriterLock
এবং ReaderWriterLockSlim
এর মধ্যেও বলা যেতে পারে Semaphore
এবং। SemaphoreSlim
নেট 4.0 ইত্যাদি নতুন It এটি সত্য যে পরবর্তী xxSlim
শ্রেণিগুলি সিস্টেম-ব্যাপী সিঙ্কের আদিম হিসাবে ব্যবহার করা যায় না, তবে সেগুলি কখনই বোঝানো হয়নি - সেগুলি "কেবল" বোঝানো হয়েছিল দ্রুত এবং আরো সংস্থান বন্ধুত্বপূর্ণ হতে।
আমি ইতিমধ্যে একই মেশিনে অ্যাপ্লিকেশনটির একটি অনুলিপি চালু আছে কিনা তা পরীক্ষা করে দেখার জন্য আমি একটি মুটেক্স ব্যবহার করি।
bool firstInstance;
Mutex mutex = new Mutex(false, @"Local\DASHBOARD_MAIN_APPLICATION", out firstInstance);
if (!firstInstance)
{
//another copy of this application running
}
else
{
//run main application loop here.
}
// Refer to the mutex down here so garbage collection doesn't chuck it out.
GC.KeepAlive(mutex);
ইতিমধ্যে অনেক কিছু বলা হয়েছে, তবে এটি সহজ করার জন্য, এখানে আমার নেওয়া।
লক -> ব্যবহার করা সহজ, মনিটরে মোড়ক, কোনও অ্যাপডোমায়নে থ্রেড জুড়ে লক।
নামবিহীন মুটেক্সলক স্কোপ ব্যতীত লক অনুরূপ -> এটি আরও একটি প্রক্রিয়াতে অ্যাপডোমাইন জুড়ে।
নামকরণ করা মিটেক্স -> লকিংয়ের সুযোগটি নামবিহীন মিউটেক্সের চেয়েও বেশি এবং এটি একটি অপারেটিং সিস্টেমে প্রক্রিয়া জুড়ে।
সুতরাং এখন বিকল্পগুলি রয়েছে, আপনার ক্ষেত্রে এটির ক্ষেত্রে সবচেয়ে ভাল মানা উচিত।
মুটেক্স একটি ক্রস প্রক্রিয়া এবং কোনও অ্যাপ্লিকেশনটির একাধিক উদাহরণ না চালানোর একটি ক্লাসিক উদাহরণ থাকবে।
২ য় উদাহরণ হিসাবে বলা হয় যে আপনার কাছে একটি ফাইল রয়েছে এবং আপনি একই ফাইলটি অ্যাক্সেস করার জন্য আলাদা প্রক্রিয়া চান না, আপনি একটি মুটেক্স প্রয়োগ করতে পারেন তবে একটি জিনিস মনে রাখবেন যে মুটেক্স একটি অপারেটিং সিস্টেম প্রশস্ত এবং দুটি দূরবর্তী প্রক্রিয়ার মধ্যে ব্যবহার করতে পারবেন না।
লক আপনার কোডের বিভাগটি রক্ষা করার এক সহজ উপায় এবং এটি অ্যাপডোমেন নির্দিষ্ট, আপনি আরও নিয়ন্ত্রিত সিঙ্ক্রোনাইজেশন চাইলে আপনি মনিটরের সাথে লকটি প্রতিস্থাপন করতে পারেন।
উত্তরগুলিতে উল্লেখ করা হয়নি এমন আরও কয়েকটি ছোটখাটো পার্থক্য:
লকগুলি ব্যবহারের ক্ষেত্রে, আপনি নিশ্চিত থাকতে পারেন যে লকের ব্লকের ভিতরে কোনও ব্যতিক্রম ঘটলে লকটি প্রকাশ হবে ।
এটা এ কারণে যে ফণা অধীন লক ব্যবহারের মনিটর এবং বাস্তবায়িত হয় এই পথ:
object __lockObj = x;
bool __lockWasTaken = false;
try
{
System.Threading.Monitor.Enter(__lockObj, ref __lockWasTaken);
// Your code...
}
finally
{
if (__lockWasTaken) System.Threading.Monitor.Exit(__lockObj);
}
সুতরাং, যে কোনও ক্ষেত্রে, লকটি মুক্তি পেয়েছে, এবং আপনাকে এটি ম্যানুয়ালি মুক্তি দেওয়ার দরকার নেই (যেমন আপনি মুটেক্সগুলির জন্য করতেন)।
লকগুলির জন্য, আপনি সাধারণত লক করতে কোনও ব্যক্তিগত অবজেক্ট ব্যবহার করেন (এবং এটি ব্যবহার করা উচিত )।
এটি বিভিন্ন কারণে করা হয়। (আরও তথ্য: এই উত্তর এবং অফিসিয়াল ডকুমেন্টেশন দেখুন )।
সুতরাং, লকগুলির ক্ষেত্রে, আপনি বাইরে থেকে লক করা অবজেক্টটিতে (দুর্ঘটনাক্রমে লাভ) অর্জন করতে পারবেন না এবং কিছু ক্ষতি করতে পারবেন।
তবে মুটেক্সের ক্ষেত্রে আপনি এমন একটি মুটেক্স থাকা সাধারণ যা সাধারণভাবে চিহ্নিত করা হয়েছে এবং যে কোনও জায়গা থেকে ব্যবহৃত হয়েছে।