Mutex به معنای انحصار متقابل است. یک کلاس در framework.NET است و همان فرایند هم زمان سازی thread ها است. mutex از اجرای هم زمان یک منبع توسط چند thread به طور هم زمان جلوگیری میکند و فقط به یک thread خاص اجازه انجام یک عمل مشخص را میدهد , در کارهای تک فرایندی و جند فرایندی به کار میرود. همچنین میتواند برای همزمان سازی درون فرایندی استفاده شود.
Mutex
Monitor/lock مانع از به اشتراک گداشتن منابع حاصل از thread های داخلی میشود اما Mutex به خوبی مانع از به اشتراک گذاشتن منابع داخلی حاصل از thread و همچنین منابع خارجی حاصل از thread ها میشود.
به عبارت دیگر ما میتوانی بگیم Mutex , thread های ایمنی برای internal/external thread مهیا میکند.
مثال:
در این مثال چندین thread در حال نوشته شدن بر روی فایل هستند.
ما چندین thread هم زمان داریم که از Mutex استفاده میکنند ودر یک زمان فقط یک thread به منابع اشتراک گذاشته شده (در مثال زیر file ) دسترسی دارد.
using System; using System.Threading; using System.IO; class ConsoleApplication1 { static void Main(string[] args) { for (int i = 0; i < 5; i++) { Thread thread = new Thread(new ThreadStart(Go)); thread.Name = String.Concat("Thread ", i); thread.Start(); } Console.ReadLine(); } static void Go() { Thread.Sleep(500); WriteFile(); } static Mutex mutex = new Mutex(); static void WriteFile() { mutex.WaitOne(); String ThreadName = Thread.CurrentThread.Name; Console.WriteLine("{0} using resource", ThreadName); try { using(StreamWriter sw = new StreamWriter("C:\\abc.txt", true)) { sw.WriteLine(ThreadName); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.WriteLine("{0} releasing resource", ThreadName); mutex.ReleaseMutex(); }
بررسی یک نمونه برنامه:
namespace ConsoleApplication1 { class SingleInstance { static void Main(string[] args) { String appGUID = ”۵ a913d2e - 1 d4b - 492 c - a408 - df315ca3de93”; bool ok; Mutex mutex = new System.Threading.Mutex(true, appGUID, out ok); if (!ok) { Console.WriteLine("Another instance is already running."); } else { Console.WriteLine("Single instance is running."); } Console.ReadLine(); } } }
هنگامی که برنامه برای اولین بار اجرا میشود شما میتوانید پیام زیر را ببینید.
هنگامی که برنامه بیش از یک بار اجرا میشود پیام زیر نمایش خواهد شد.
توجه کنید:
نام Mutex باید یک علامت assembly منحصر به فرد باشد.
این یک اجرا کننده بازدید است بنابراین هنگامی که هماهنگ سازی در سراسر مرزهای فرایند مورد نیاز است باید استفاده شود.
موفق باشید !
بسیار عالی و مفید ممنون
۱۷