লক এবং মিটেক্সের মধ্যে পার্থক্য কী?


129

লক এবং মিটেক্সের মধ্যে পার্থক্য কী? এগুলি কেন বিনিময়যোগ্যভাবে ব্যবহার করা যাবে না?

উত্তর:


146

একটি লক অ্যাপডোমাইনের সাথে সুনির্দিষ্ট, অপারেটিং সিস্টেমে মুটেক্স আপনাকে আন্তঃ প্রক্রিয়া লকিং এবং সিঙ্ক্রোনাইজেশন (আইপিসি) করতে দেয়।


95

lockএকটি সংকলক কীওয়ার্ড, প্রকৃত শ্রেণি বা বস্তু নয়। এটি Monitorক্লাসের কার্যকারিতার চারপাশে একটি মোড়ক Monitorএবং সাধারণ ক্ষেত্রে এটির সাথে কাজ করা আরও সহজ করার জন্য ডিজাইন করা হয়েছে ।

Monitor(এবং lockশব্দ), হিসাবে Darin বলেন অবধি সীমিত AppDomain। মূলত কারণ "মজাদার অবস্থান" পরিচালনা করতে এবং পরিচয় বজায় রাখতে একটি স্মৃতি ঠিকানার (একটি তাত্ক্ষণিক বস্তুর আকারে) একটি রেফারেন্স প্রয়োজনMonitor

Mutexঅন্যদিকে, একটি অপারেটিং সিস্টেম কনস্ট্রাক্ট কাছাকাছি একটি নেট মোড়কের, এবং সিস্টেম-ব্যাপী সিঙ্ক্রোনাইজেশন ব্যবহার করা যেতে পারে, স্ট্রিং ব্যবহার করে ডেটা এটির শনাক্তকারীর যেমন (ডাটা একটি পয়েন্টার পরিবর্তে)। দুটি মুটিেক্স যা দুটি সম্পূর্ণ পৃথক পৃথক মেমরি ঠিকানার মধ্যে দুটি স্ট্রিংকে উল্লেখ করে তবে একই ডেটা থাকা আসলে একই অপারেটিং-সিস্টেম মিটেক্স ব্যবহার করবে।


54

হয় প্রক্রিয়াতে স্থানীয় বা সিস্টেম-ব্যাপী স্থানীয়Mutex হতে পারেএমএসডিএন :

মিউটেক্সগুলি দুটি ধরণের হয়: স্থানীয় মিটেক্সেস, যা নামবিহীন এবং নামকরণ করা হয়েছে মাইটেক্সেস। একটি স্থানীয় মিউটেক্স কেবলমাত্র আপনার প্রক্রিয়াতেই বিদ্যমান।

তদ্ব্যতীত, টার্মিনাল পরিষেবাদি সহ কোনও সিস্টেমে সিস্টেম-ব্যাপী মিটেক্স ব্যবহার করার সময় - একই পৃষ্ঠায় বিস্তারিত - একটি বিশেষ যত্ন নেওয়া উচিত।

মধ্যে পার্থক্য এক Mutexএবং lockযে Mutexএকটি সদ্ব্যবহার কার্নেল পর্যায়ের কনস্ট্রাক্ট , তাই সিঙ্ক্রোনাইজেশন সবসময় অন্তত একটি ব্যবহারকারী স্পেস-কার্নেল স্থান রূপান্তর প্রয়োজন হবে।

lock- এটি Monitorক্লাসের সত্যই শর্টকাট , অন্যদিকে কার্নেল সংস্থানগুলি বরাদ্দ করা এবং কার্নেল কোডে স্থানান্তর এড়াতে চেষ্টা করে (এবং এইভাবে ঝুঁকির ও দ্রুততর হয় - যদি কোনও উইনাপিআইয়ের মতো দেখতে পাওয়া যায় তবে এটি তৈরি হবে)CriticalSection )।

অন্য পার্থক্যটি অন্যরা কী দেখায়: একটি নামক Mutex ক্যান প্রক্রিয়া জুড়ে ব্যবহার করা পারে।

কারও কারও বিশেষ প্রয়োজন বা প্রসেস জুড়ে সুসংগতকরণের প্রয়োজন না থাকলে এটি lock(ওরফে আটকে থাকা) আরও ভালMonitor ) ˛

অন্যান্য বেশ কয়েকটি "গৌণ" পার্থক্য রয়েছে, যেমন বিসর্জন কীভাবে পরিচালনা করা হয় ইত্যাদি etc.

একই সম্পর্কে 3.5 ReaderWriterLockএবং ReaderWriterLockSlimএর মধ্যেও বলা যেতে পারে Semaphoreএবং। SemaphoreSlimনেট 4.0 ইত্যাদি নতুন It এটি সত্য যে পরবর্তী xxSlimশ্রেণিগুলি সিস্টেম-ব্যাপী সিঙ্কের আদিম হিসাবে ব্যবহার করা যায় না, তবে সেগুলি কখনই বোঝানো হয়নি - সেগুলি "কেবল" বোঝানো হয়েছিল দ্রুত এবং আরো সংস্থান বন্ধুত্বপূর্ণ হতে।


25

আমি ইতিমধ্যে একই মেশিনে অ্যাপ্লিকেশনটির একটি অনুলিপি চালু আছে কিনা তা পরীক্ষা করে দেখার জন্য আমি একটি মুটেক্স ব্যবহার করি।

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);

8

ইতিমধ্যে অনেক কিছু বলা হয়েছে, তবে এটি সহজ করার জন্য, এখানে আমার নেওয়া।

লক -> ব্যবহার করা সহজ, মনিটরে মোড়ক, কোনও অ্যাপডোমায়নে থ্রেড জুড়ে লক।

নামবিহীন মুটেক্সলক স্কোপ ব্যতীত লক অনুরূপ -> এটি আরও একটি প্রক্রিয়াতে অ্যাপডোমাইন জুড়ে।

নামকরণ করা মিটেক্স -> লকিংয়ের সুযোগটি নামবিহীন মিউটেক্সের চেয়েও বেশি এবং এটি একটি অপারেটিং সিস্টেমে প্রক্রিয়া জুড়ে।

সুতরাং এখন বিকল্পগুলি রয়েছে, আপনার ক্ষেত্রে এটির ক্ষেত্রে সবচেয়ে ভাল মানা উচিত।


যেমন আমি উত্তরগুলি এবং মিটেক্সের উদাহরণগুলি এখানে এমএসডিএন.মিকাইক্রোসফটকম / en-us / library /… থেকে বুঝতে পেরেছি : একটি নামবিহীন মুটেক্স একটি লকের মতো কাজ করে। তবে mutex.WaitOne (1000) আমাদের লকটি শেষ করার জন্য একটি সুযোগ দেয়। অন্যদিকে, মনিটর.ট্রিইন্টার আমাদেরও সেই ক্ষমতা দেয়। উল্লিখিত হিসাবে, মুটেক্স একটি মোড়ক। সুতরাং আমি একটি নামবিহীন মিটেক্সের পরিবর্তে লক বা মনিটর ব্যবহার করব। তবে যদি প্রক্রিয়া জুড়ে কোনও লক প্রয়োজন হয় তবে একটি নামযুক্ত মুটেক্স যাওয়ার উপায়। আমি ভুল হলে আমাকে সংশোধন করুন।
কোরে

6

মুটেক্স একটি ক্রস প্রক্রিয়া এবং কোনও অ্যাপ্লিকেশনটির একাধিক উদাহরণ না চালানোর একটি ক্লাসিক উদাহরণ থাকবে।

২ য় উদাহরণ হিসাবে বলা হয় যে আপনার কাছে একটি ফাইল রয়েছে এবং আপনি একই ফাইলটি অ্যাক্সেস করার জন্য আলাদা প্রক্রিয়া চান না, আপনি একটি মুটেক্স প্রয়োগ করতে পারেন তবে একটি জিনিস মনে রাখবেন যে মুটেক্স একটি অপারেটিং সিস্টেম প্রশস্ত এবং দুটি দূরবর্তী প্রক্রিয়ার মধ্যে ব্যবহার করতে পারবেন না।

লক আপনার কোডের বিভাগটি রক্ষা করার এক সহজ উপায় এবং এটি অ্যাপডোমেন নির্দিষ্ট, আপনি আরও নিয়ন্ত্রিত সিঙ্ক্রোনাইজেশন চাইলে আপনি মনিটরের সাথে লকটি প্রতিস্থাপন করতে পারেন।


1

উত্তরগুলিতে উল্লেখ করা হয়নি এমন আরও কয়েকটি ছোটখাটো পার্থক্য:

  1. লকগুলি ব্যবহারের ক্ষেত্রে, আপনি নিশ্চিত থাকতে পারেন যে লকের ব্লকের ভিতরে কোনও ব্যতিক্রম ঘটলে লকটি প্রকাশ হবে ।
    এটা এ কারণে যে ফণা অধীন লক ব্যবহারের মনিটর এবং বাস্তবায়িত হয় এই পথ:

     object __lockObj = x;
     bool __lockWasTaken = false;
     try
     {
         System.Threading.Monitor.Enter(__lockObj, ref __lockWasTaken);
         // Your code...
     }
     finally
     {
         if (__lockWasTaken) System.Threading.Monitor.Exit(__lockObj);
     }

    সুতরাং, যে কোনও ক্ষেত্রে, লকটি মুক্তি পেয়েছে, এবং আপনাকে এটি ম্যানুয়ালি মুক্তি দেওয়ার দরকার নেই (যেমন আপনি মুটেক্সগুলির জন্য করতেন)।

  2. লকগুলির জন্য, আপনি সাধারণত লক করতে কোনও ব্যক্তিগত অবজেক্ট ব্যবহার করেন (এবং এটি ব্যবহার করা উচিত )।
    এটি বিভিন্ন কারণে করা হয়। (আরও তথ্য: এই উত্তর এবং অফিসিয়াল ডকুমেন্টেশন দেখুন )।

সুতরাং, লকগুলির ক্ষেত্রে, আপনি বাইরে থেকে লক করা অবজেক্টটিতে (দুর্ঘটনাক্রমে লাভ) অর্জন করতে পারবেন না এবং কিছু ক্ষতি করতে পারবেন।
তবে মুটেক্সের ক্ষেত্রে আপনি এমন একটি মুটেক্স থাকা সাধারণ যা সাধারণভাবে চিহ্নিত করা হয়েছে এবং যে কোনও জায়গা থেকে ব্যবহৃত হয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.