Mutex的英文解释就是互斥体,也就是线程或者进程在同时访问一个资源的时候,是需要排他访问,也就是说一个时间段内只能有一个线程对象访问公共资源。
Mutex的构造函数分为Mutex(),Mutex(Boolean),Mutex(boolean, string)。
下面就较这3个构造函数分别进行比较分析。
1、 Mutex()这样一个构造函数相当于执行了Mutex(false),这样一个构造函数,MSDN上说,这样构造的对象,其所属的线程并不拥有互斥体。我觉得应该是线程不拥有互斥体的所有权才对。
2、 Mutex(Boolean)在CSDN上说的就是如果是true则表示拥有互斥体的所有权,false表示不拥有互斥体的所有权。
3、 Mutex(boolean, string)表示构造一个指定name的互斥体,boolean表示是否有该互斥体的所有权。应为Mutex是一个系统全局对象,因此,就算每次去new一个Mutex,如果name一样,那么也就只是构造了一个Mutex对象。Boolean参数表示了线程是否拥有该对象的初始所有权,如果是true的话,那么应该由该线程第一个创建该互斥体,整个系统中不应该有第二个线程去创建它。否则会报出“由于出现被放弃的 mutex,等待过程结束。”的错误。
例子:
public class ThreadMutex
{
public void Test()
{
Threadt1 = new Thread(Thread1);
Threadt2 = new Thread(Thread2);
t1.Start();
t2.Start();
}
public void Thread1()
{
Mutexm = new Mutex(true, "test");
boolb2 = m.WaitOne();
Console.WriteLine("Thread1 get the mutex : " + b2);
Thread.Sleep(5000);
m.ReleaseMutex();
}
public void Thread2()
{
Mutexm = new Mutex(true, "test");
boolb2 = m.WaitOne();
Console.WriteLine("Thread2 get the mutex : " + b2);
Thread.Sleep(1000);
m.ReleaseMutex();
}
}
所以,在MSDN上说,“由于没有机制来确定是否创建了已命名的系统互斥体,因此,当调用此构造函数重载时,最好将 initiallyOwned 指定为 false。”
所以,最好是在构建Mutex对象的时候,使用new Mutex(false, “xxx”)来构建一个Mutex对象。