একটি মিউটেক্স একটি প্রোগ্রামিং ধারণা যা ঘন ঘন মাল্টি-থ্রেডিং সমস্যাগুলি সমাধান করার জন্য ব্যবহৃত হয়। সম্প্রদায়ের কাছে আমার প্রশ্ন:
মিউটেক্স কী এবং আপনি কীভাবে এটি ব্যবহার করবেন?
একটি মিউটেক্স একটি প্রোগ্রামিং ধারণা যা ঘন ঘন মাল্টি-থ্রেডিং সমস্যাগুলি সমাধান করার জন্য ব্যবহৃত হয়। সম্প্রদায়ের কাছে আমার প্রশ্ন:
মিউটেক্স কী এবং আপনি কীভাবে এটি ব্যবহার করবেন?
উত্তর:
যখন আমি কর্মক্ষেত্রে একটি প্রচণ্ড উত্তপ্ত আলোচনা করছি, আমি এমন একটি রাবার মুরগি ব্যবহার করি যা আমি আমার ডেস্কে রাখি ঠিক এইরকম অনুষ্ঠানের জন্য। মুরগি ধরে থাকা ব্যক্তিই একমাত্র ব্যক্তি যিনি কথা বলার অনুমতি পান। মুরগি না ধরলে আপনি কথা বলতে পারবেন না। আপনি কেবল এটিই নির্দেশ করতে পারেন যে আপনি মুরগি চান এবং কথা বলার আগে এটি না পাওয়া পর্যন্ত অপেক্ষা করুন। একবার আপনি কথা শেষ করার পরে, মুরগিকে আবার মডারেটরের হাতে দিতে পারেন যিনি পরবর্তী ব্যক্তির সাথে কথা বলার জন্য এটি দেবেন। এটি নিশ্চিত করে যে লোকেরা একে অপরের উপরে কথা বলতে না, এবং কথা বলার জন্য নিজস্ব জায়গাও রয়েছে।
চিকেনকে মুটেক্স এবং থ্রেডযুক্ত ব্যক্তির সাথে প্রতিস্থাপন করুন এবং আপনার কাছে মূলত একটি মিউটেক্সের ধারণা রয়েছে।
অবশ্যই, রাবার মিটেক্সের মতো কোনও জিনিস নেই। কেবল রাবারের মুরগি। আমার বিড়ালদের একবার রাবারের মাউস ছিল, তবে তারা এটি খেয়েছে।
অবশ্যই, আপনি রাবারের মুরগি ব্যবহার করার আগে, আপনাকে নিজের কাছে জিজ্ঞাসা করা উচিত যে আপনার আসলে এক ঘরে 5 জন লোকের দরকার আছে এবং রুমে থাকা একজন ব্যক্তির নিজের কাজ সমস্ত কাজ করা কি কেবল সহজ নয়? আসলে, এটি সাদৃশ্যটি প্রসারিত করছে, তবে আপনি ধারণাটি পাবেন।
একটি Mutex একটি পারস্পরিক একচেটিয়া পতাকা। এটি কোডের একটি বিভাগে গেট রক্ষক হিসাবে কাজ করে যা একটি থ্রেডকে অনুমতি দেয় এবং অন্য সকলের অ্যাক্সেস অবরুদ্ধ করে। এটি নিশ্চিত করে যে কোডটি নিয়ন্ত্রিত হচ্ছে কেবল একবারে একক থ্রেড দ্বারা আঘাত করা হবে। আপনার কাজ শেষ হয়ে গেলে কেবল মুটেক্সকে ছেড়ে দিতে ভুলবেন না। :)
পারস্পরিক বর্জন। এটিতে উইকিপিডিয়া এন্ট্রি এখানে:
http://en.wikipedia.org/wiki/Mutual_exclusion
একটি মিটেক্সের বিন্দুটি দুটি থ্রেডকে সিঙ্ক্রোনাইজ করা। যখন আপনার দুটি থ্রেডে একটি একক সংস্থান অ্যাক্সেস করার চেষ্টা করা হয়, তখন সাধারণ প্যাটার্নটিতে কোডটি প্রবেশের আগে মুটেক্স সেট করতে অ্যাক্সেসের চেষ্টা করার কোডের প্রথম ব্লক থাকা উচিত। যখন দ্বিতীয় কোড ব্লকটি অ্যাক্সেসের চেষ্টা করে, এটি মাইটেক্সটি সেট করা দেখায় এবং কোডের প্রথম ব্লকটি সম্পূর্ণ না হওয়া অবধি অপেক্ষা করে (এবং মিউটেক্সটিকে আন-সেট করে), তারপরে অবিরত থাকে।
কীভাবে এটি সম্পাদিত হয় তার নির্দিষ্ট বিবরণ অবশ্যই স্পষ্টতই প্রোগ্রামিং ভাষার মাধ্যমে পরিবর্তিত হয়।
আপনার যখন একাধিক-থ্রেডযুক্ত অ্যাপ্লিকেশন রয়েছে তখন বিভিন্ন থ্রেড কখনও কখনও একটি সাধারণ সংস্থান ভাগ করে যেমন একটি পরিবর্তনশীল বা অনুরূপ। এই ভাগ করা উত্সটি প্রায়শই একই সময়ে অ্যাক্সেস করা যায় না, সুতরাং একবারে কেবলমাত্র একটি থ্রেড সেই সংস্থানটি ব্যবহার করছে তা নিশ্চিত করার জন্য একটি নির্মাণের প্রয়োজন।
ধারণাটিকে "মিউচুয়াল এক্সক্লুশন" (সংক্ষিপ্ত মিটেক্স) বলা হয় এবং এটি সেই উপায়ের মাধ্যমে সেই অঞ্চলে কেবলমাত্র একটি থ্রেড অনুমোদিত হয় তা নিশ্চিত করার একটি উপায় that
এগুলি কীভাবে ব্যবহার করবেন তা ভাষা নির্দিষ্ট, তবে প্রায়শই (সর্বদা না হলে) অপারেটিং সিস্টেম মিটেক্সের উপর ভিত্তি করে।
উদাহরণস্বরূপ ফাংশনাল প্রোগ্রামিং (হাস্কেল, এমএল ভাল উদাহরণ) উদাহরণস্বরূপ কিছু ভাষার জন্য এই নির্মাণের প্রয়োজন নেই।
সি # তে, ব্যবহৃত সাধারণ মিটেক্স হ'ল মনিটর । প্রকারটি হ'ল ' সিস্টেম.ট্রেডিং.মনিটর '। এটি ' লক (অবজেক্ট) ' স্টেটমেন্টের মাধ্যমেও স্পষ্টভাবে ব্যবহার করা যেতে পারে । এর ব্যবহারের একটি উদাহরণ সিঙ্গলটন ক্লাস নির্মাণের সময়।
private static readonly Object instanceLock = new Object();
private static MySingleton instance;
public static MySingleton Instance
{
lock(instanceLock)
{
if(instance == null)
{
instance = new MySingleton();
}
return instance;
}
}
ব্যক্তিগত লক অবজেক্ট ব্যবহার করে লক স্টেটমেন্টটি একটি গুরুত্বপূর্ণ বিভাগ তৈরি করে। পূর্ববর্তীটি শেষ না হওয়া পর্যন্ত প্রতিটি থ্রেড অপেক্ষা করা দরকার। প্রথম থ্রেডটি বিভাগে প্রবেশ করবে এবং উদাহরণটি সূচনা করবে। দ্বিতীয় থ্রেডটি অপেক্ষা করবে, বিভাগে প্রবেশ করবে এবং প্রাথমিক সূচনাটি পাবে।
স্থির সদস্যের যে কোনও ধরণের সিঙ্ক্রোনাইজেশন লক স্টেটমেন্টটি একইভাবে ব্যবহার করতে পারে।
একটি মিটেক্স কী ?
মিউটেক্স (প্রকৃতপক্ষে পারস্পরিক বর্জনের জন্য মিউটেক্স শব্দটি সংক্ষিপ্ত) স্পিনলক নামে পরিচিত এটি একটি সহজতম সিঙ্ক্রোনাইজেশন সরঞ্জাম যা সমালোচনামূলক অঞ্চলগুলিকে রক্ষা করতে ব্যবহার করা হয় এবং এইভাবে জাতিগত পরিস্থিতি রোধ করে। এটি একটি থ্রেডকে অবশ্যই একটি সমালোচনামূলক বিভাগে প্রবেশের আগে একটি লক অর্জন করতে হবে (সমালোচনামূলক বিভাগে বহু থ্রেডগুলি একটি সাধারণ পরিবর্তনশীল ভাগ করে নেবে, একটি টেবিল আপডেট করে, একটি ফাইল লিখবে এবং এই জাতীয়), যখন এটি সমালোচনামূলক বিভাগ ছেড়ে যায় তখন লকটি প্রকাশ করে।
একটি কি রেস অবস্থা ?
দুটি বা ততোধিক থ্রেড ভাগ করা ডেটা অ্যাক্সেস করতে পারে এমন সময় একটি দৌড়ের অবস্থা ঘটে এবং তারা একই সাথে এটি পরিবর্তন করার চেষ্টা করে। যেহেতু থ্রেড শিডিয়ুলিং অ্যালগরিদম যে কোনও সময় থ্রেডগুলির মধ্যে অদলবদল করতে পারে, তাই থ্রেডগুলি ভাগ করে নেওয়া ডেটা অ্যাক্সেস করার চেষ্টা করবে threads সুতরাং, ডেটা পরিবর্তনের ফলাফল থ্রেড শিডিয়ুলিং অ্যালগরিদমের উপর নির্ভরশীল, অর্থাত উভয় থ্রেড ডেটা অ্যাক্সেস / পরিবর্তন করতে "রেসিং" করছে।
বাস্তব জীবনের উদাহরণ:
যখন আমি কর্মক্ষেত্রে একটি প্রচণ্ড উত্তপ্ত আলোচনা করছি, আমি এমন একটি রাবার মুরগি ব্যবহার করি যা আমি আমার ডেস্কে রাখি ঠিক এইরকম অনুষ্ঠানের জন্য। মুরগি ধরে থাকা ব্যক্তিই একমাত্র ব্যক্তি যিনি কথা বলার অনুমতি পান। মুরগি না ধরলে আপনি কথা বলতে পারবেন না। আপনি কেবল এটিই নির্দেশ করতে পারেন যে আপনি মুরগি চান এবং কথা বলার আগে এটি না পাওয়া পর্যন্ত অপেক্ষা করুন। আপনার কথা শেষ হয়ে গেলে, আপনি মুরগিকে আবার মডারেটরের হাতে দিতে পারেন যিনি পরবর্তী ব্যক্তির সাথে কথা বলার জন্য এটি দেবেন। এটি নিশ্চিত করে যে লোকেরা একে অপরের উপরে কথা বলতে না, এবং কথা বলার জন্য নিজস্ব জায়গাও রয়েছে।
চিকেনকে মুটেক্স এবং থ্রেডযুক্ত ব্যক্তির সাথে প্রতিস্থাপন করুন এবং আপনার কাছে মূলত একটি মিউটেক্সের ধারণা রয়েছে।
@Xetius
সি # তে ব্যবহার:
এই উদাহরণটি দেখায় যে কোনও সুরক্ষিত সংস্থানটিতে অ্যাক্সেসকে সিঙ্ক্রোনাইজ করার জন্য কীভাবে স্থানীয় মুটেক্স অবজেক্ট ব্যবহার করা হয়। যেহেতু প্রতিটি কলিং থ্রেড মুটেক্সের মালিকানা অর্জন না করা অবরুদ্ধ করা আছে তাই থ্রেডের মালিকানা প্রকাশের জন্য এটি অবশ্যই রিলিজমিটেক্স পদ্ধতিতে কল করতে হবে।
using System;
using System.Threading;
class Example
{
// Create a new Mutex. The creating thread does not own the mutex.
private static Mutex mut = new Mutex();
private const int numIterations = 1;
private const int numThreads = 3;
static void Main()
{
// Create the threads that will use the protected resource.
for(int i = 0; i < numThreads; i++)
{
Thread newThread = new Thread(new ThreadStart(ThreadProc));
newThread.Name = String.Format("Thread{0}", i + 1);
newThread.Start();
}
// The main thread exits, but the application continues to
// run until all foreground threads have exited.
}
private static void ThreadProc()
{
for(int i = 0; i < numIterations; i++)
{
UseResource();
}
}
// This method represents a resource that must be synchronized
// so that only one thread at a time can enter.
private static void UseResource()
{
// Wait until it is safe to enter.
Console.WriteLine("{0} is requesting the mutex",
Thread.CurrentThread.Name);
mut.WaitOne();
Console.WriteLine("{0} has entered the protected area",
Thread.CurrentThread.Name);
// Place code to access non-reentrant resources here.
// Simulate some work.
Thread.Sleep(500);
Console.WriteLine("{0} is leaving the protected area",
Thread.CurrentThread.Name);
// Release the Mutex.
mut.ReleaseMutex();
Console.WriteLine("{0} has released the mutex",
Thread.CurrentThread.Name);
}
}
// The example displays output like the following:
// Thread1 is requesting the mutex
// Thread2 is requesting the mutex
// Thread1 has entered the protected area
// Thread3 is requesting the mutex
// Thread1 is leaving the protected area
// Thread1 has released the mutex
// Thread3 has entered the protected area
// Thread3 is leaving the protected area
// Thread3 has released the mutex
// Thread2 has entered the protected area
// Thread2 is leaving the protected area
// Thread2 has released the mutex
এখানে কিছু দুর্দান্ত উত্তর রয়েছে, মিটেক্স কী তা বোঝানোর জন্য এখানে আরও একটি দুর্দান্ত উপমা রয়েছে:
একটি কী দিয়ে একক টয়লেট বিবেচনা করুন । কেউ প্রবেশ করলে তারা চাবিটি নিয়ে যায় এবং টয়লেটটি দখল করে নেওয়া হয় । অন্য কারও যদি টয়লেট ব্যবহারের প্রয়োজন হয় তবে তাদের একটি সারিতে অপেক্ষা করতে হবে । টয়লেটে ব্যক্তিটি করা হয়ে গেলে তারা পরবর্তী ব্যক্তির চাবিটি সারিতে রেখে দেয়। ঠিক বুঝেছ?
গল্পের টয়লেটটিকে একটি ভাগ করা সংস্থান এবং একটি মিটেক্সের চাবিতে রূপান্তর করুন । টয়লেটের চাবিটি (একটি লক অর্জন) আপনাকে এটি ব্যবহারের অনুমতি দেয়। যদি কোনও কী না থাকে (লকটি তালাবদ্ধ থাকে) আপনাকে অপেক্ষা করতে হবে। যখন ব্যক্তিটি দ্বারা চাবিটি ফিরে আসে ( লকটি ছেড়ে দিন ) আপনি এখন তা অর্জনে মুক্ত।
মিটেক্স বুঝতে প্রথমে আপনাকে "রেস কন্ডিশন" কী তা জানতে হবে এবং তারপরে কেবল মিউটেক্সের প্রয়োজন কেন তা আপনি বুঝতে পারবেন। ধরুন আপনার একটি মাল্টি-থ্রেডিং প্রোগ্রাম রয়েছে এবং আপনার দুটি থ্রেড রয়েছে। এখন, আপনার চাকরির সারিতে একটি কাজ আছে। প্রথম থ্রেড জব সারিটি পরীক্ষা করবে এবং কাজটি সন্ধানের পরে এটি কার্যকর করা শুরু করবে। দ্বিতীয় থ্রেডটিও কাজের সারিটি পরীক্ষা করে দেখবে যে সারিতে একটি কাজ রয়েছে। সুতরাং, এটি একই কাজ পয়েন্টার নির্ধারণ করবে। সুতরাং, এখন কি হয়, উভয় থ্রেড একই কাজ সম্পাদন করছে। এটি বিভাজন ত্রুটির কারণ হবে। এটি একটি রেসের শর্তের উদাহরণ।
এই সমস্যার সমাধান হ'ল মিটেক্স। মিউটেক্স হ'ল এক ধরণের লক যা একবারে একটি থ্রেড লক করে। অন্য থ্রেড যদি এটি লক করতে চায় তবে থ্রেডটি কেবল অবরুদ্ধ হয়ে যায়।
এই পিডিএফ ফাইল লিঙ্কে MUTEX বিষয় সত্যিই পড়ার জন্য মূল্যবান।
Mutex: mutex ঘোরা Mut ual প্রাক্তন clusion। এর অর্থ একটি সময়ে একটি প্রক্রিয়া / থ্রেড সমালোচনামূলক বিভাগে প্রবেশ করতে পারে। একযোগে প্রোগ্রামিং যেখানে একাধিক থ্রেড / প্রক্রিয়া ভাগ করা সংস্থান (যে কোনও ভেরিয়েবল, ভাগ করা মেমরি ইত্যাদি) আপডেট করার চেষ্টা করে তাতে কিছু অপ্রত্যাশিত ফলাফল হতে পারে। (ফলাফলটি কোন থ্রেড / প্রক্রিয়াটিতে প্রথম অ্যাক্সেস পায় তার উপর নির্ভর করে)।
এ জাতীয় অপ্রত্যাশিত ফলাফল এড়াতে আমাদের কয়েকটি সিঙ্ক্রোনাইজেশন প্রক্রিয়া দরকার যা এটি নিশ্চিত করে যে একটি সময়ে কেবল একটি থ্রেড / প্রক্রিয়া এই জাতীয় সংস্থানটিতে অ্যাক্সেস পেয়েছে।
pthread লাইব্রেরি Mutex জন্য সমর্থন সরবরাহ করে।
typedef union
{
struct __pthread_mutex_s
{
***int __lock;***
unsigned int __count;
int __owner;
#ifdef __x86_64__
unsigned int __nusers;
#endif
int __kind;
#ifdef __x86_64__
short __spins;
short __elision;
__pthread_list_t __list;
# define __PTHREAD_MUTEX_HAVE_PREV 1
# define __PTHREAD_SPINS 0, 0
#else
unsigned int __nusers;
__extension__ union
{
struct
{
short __espins;
short __elision;
# define __spins __elision_data.__espins
# define __elision __elision_data.__elision
# define __PTHREAD_SPINS { 0, 0 }
} __elision_data;
__pthread_slist_t __list;
};
#endif
এটি mutex ডেটা টাইপ যেমন pthread_mutex_t এর কাঠামো। যখন মিউটেক্স লক হয়ে থাকে, __ লকটি 1 এ সেট করুন it এটি আনলক করা হলে __লোকটি 0 এ সেট করুন।
এটি নিশ্চিত করে যে কোনও দুটি প্রক্রিয়া / থ্রেড একই সময়ে সমালোচনামূলক বিভাগে অ্যাক্সেস করতে পারে না।