关于Mutex的构造函数参数设置

来源:互联网 发布:java list集合去重 编辑:程序博客网 时间:2024/05/18 02:31

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 classThreadMutex

    {

        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对象。

0 0
原创粉丝点击