mutex简单介绍
  “mutex”是术语“互相排斥(mutually exclusive)”的简写形式,也就是互斥量。
  当两个或更多线程需要同时访问⼀个共享资源时,系统需要使⽤同步机制来确保⼀次只有⼀个线程使⽤该资源。Mutex 是同步基元,它只向⼀个线程授予对共享资源的独占访问权。如果⼀个线程获取了互斥体,则要获取该互斥体的第⼆个线程将被挂起,直到第⼀个线程释放该互斥体。
  可以使⽤⽅法请求互斥体的所属权。拥有互斥体的线程可以在对的重复调⽤中请求相同的互斥体⽽不会阻⽌其执⾏。但线程必须调⽤⽅法同样多的次数以释放互斥体的所属权。
  在运⾏终端服务的服务器上,已命名的系统 mutex 可以具有两级可见性。如果名称以前缀“Global\”开头,则 mutex 在所有终端服务器会话中均为可见。如果名称以前缀“Local\”开头,则 mutex 仅在创建它的终端服务器会话中可见。在这种情况下,服务器上各个其他终端服务器会话中都可以拥有⼀个名称相同的独⽴ mutex。如果创建已命名 mutex 时不指定前缀,则它将采⽤前缀“Local\”。在终端服务器会话中,只是名称前缀不同的两个 mutex 是独⽴的 mutex,这两个 mutex 对于终端服务器会话中的所有进程均为可见。即:前缀名
称“Global\”和“Local\”说明 mutex 名称相对于终端服务器会话(⽽并⾮相对于进程)的范围。
简单⽰例:
static class Program    {
/// <summary>
/// 应⽤程序的主⼊⼝点。
/// </summary>
[STAThread]
static void Main()
{
bool CreateNew;
System.Threading.Mutex mutex = new System.Threading.Mutex(false, "Application.ProjectName", out CreateNew);
if (!CreateNew)
{
      System.Windows.Forms.MessageBox.Show("系统已运⾏,不⽤重复运⾏!");
Application.Exit();
return;
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LoginForm());
}
}
此⽰例演⽰如何使⽤局部 Mutex 对象来同步对受保护资源的访问。
/
/ This example shows how a Mutex is used to synchronize access
// to a protected resource. Unlike Monitor, Mutex can be used with
// WaitHandle.WaitAll and WaitAny, and can be passed across
// AppDomain boundaries.
using System;
using System.Threading;
class Test
{
// 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++)
exited{
Thread myThread = new Thread(new ThreadStart(MyThreadProc));            myThread.Name = String.Format("Thread{0}", i + 1);
myThread.Start();
}
// The main thread exits, but the application continues to
// run until all foreground threads have exited.
}
private static void MyThreadProc()
{
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.
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\r\n",
Thread.CurrentThread.Name);
/
/ Release the Mutex.
mut.ReleaseMutex();
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。