大家好,欢迎来到IT知识分享网。
只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。
可以使用 WaitHandle.WaitOne 方法请求互斥体的所属权。拥有互斥体的线程可以在对 WaitOne 的重复调用中请求相同的互斥体而不会阻止其执行。但线程必须调用 ReleaseMutex 方法同样多的次数以释放互斥体的所属权。Mutex 类强制线程标识,因此互斥体只能由获得它的线程释放。
举个例子,我们可以把Mutex看作一个出租车,乘客看作线程。乘客首先等车,然后上车,最后下车。当一个乘客在车上时,其他乘客就只有等他下车以后才可以上车。而线程与Mutex对象的关系也正是如此,线程使用Mutex.WaitOne()方法等待Mutex对象被释放,如果它等待的Mutex对象被释放了,它就自动拥有这个对象,直到它调用Mutex.ReleaseMutex()方法释放这个对象,而在此期间,其他想要获取这个Mutex对象的线程都只有等待。
WiteOne的作用是”阻塞当前线程,提供对该线程的原子操作,也就是说当一个线程遇到WiteOne的时候,如果在WiteOne里面没有线程在操作,则此线程进去操作.而里面有线程的时候,所有到此的线程均需要排队等候里面的线程执行完毕,而控制这样操作的结束标记就是使用ReleaseMutex 方法.
看下面的示例(摘自MSDN),如何使用局部 Mutex 对象来同步对受保护资源的访问。
namespace MutexDemo
{
class Program
{
private static Mutex mut = new Mutex();
private const int numIterations = 1;
private const int numThreads = 3;
static void Main(string[] args)
{
for (int i = 0; i < numThreads; i++)
{
Thread myThread = new Thread(new ThreadStart(MyThreadProc));
myThread.Name = String.Format(“Thread{0}”, i + 1);
myThread.Start();
}
}
private static void MyThreadProc()
{
for (int i = 0; i < numIterations; i++)
{
UseResource();
}
}
private static void UseResource()
{
mut.WaitOne();
Console.WriteLine(“{0} is leaving the protected area/r/n”,Thread.CurrentThread.Name);
Thread.Sleep(500);
Console.WriteLine(“{0} is leaving the protected area/r/n”,Thread.CurrentThread.Name);
mut.ReleaseMutex();
}
}
}
程序输出:
Thread1 is leaving the protected area
Thread1 is leaving the protected area
Thread2 is leaving the protected area
Thread2 is leaving the protected area
Thread3 is leaving the protected area
Thread3 is leaving the protected area
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/24817.html