【多线程学习】:互斥锁Mutex

来源:互联网 发布:轩辕世界神兽数据 编辑:程序博客网 时间:2024/05/02 04:47

开始的时候自己写了段代码,其中有句关于Mutex声明方式,分别采用了带名称的和不带名称的,代码如下:

//Mutex mutex = new Mutex(false, "MyMutex");//带名称            Mutex mutex = new Mutex(false);             //不带名称            mutex.WaitOne();            try            {                string str = ".....";//省略......                Console.WriteLine(str);                Thread.Sleep(1000);            }            catch (Exception)            {            }            mutex.ReleaseMutex();


其中带名称和不带名称的执行顺序显示不同,截图:

带有初始名称的声明方法的运行结果显示如下:

 

不带初始名称的声明方法的运行结果显示如下:

 

运行了很多次,都是这样的执行的顺序。没想明白原因,后来查MSDN,有了解到一些关于Mutex的其他内容,现在请看MSDN对它的描述:

Mutex 类

一个同步基元,可用于进程间同步。

Mutex 构造函数:

public Mutex()

描述:

调用此构造函数重载相当于调用 Mutex(Boolean) 构造函数重载并将互斥体的初始所属权指定为 false。      

也即调用线程不拥有此互斥体。

关于此构造函数的调用代码连接:点击打开链接

public Mutex(bool initiallyOwned)

描述:

用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值来初始化 Mutex 类的新实例。

参数

initiallyOwned
类型:System.Boolean
如果给调用线程赋予互斥体的初始所属权,则为 true;否则为 false
public Mutex(bool initiallyOwned,string name)

 

参数

initiallyOwned
类型:System.Boolean
如果为 true,则给予调用线程已命名的系统互斥体的初始所属权(如果已命名的系统互斥体是通过此调用创建的);否则为 false
name
类型:System.String
Mutex 的名称。 如果值为 null,则 Mutex 是未命名的。 

 

描述:

如果 name 不为 null  initiallyOwned  true,则只有当已命名的系统互斥体是通过此调用创建的时,调用线程才拥有该互斥体。 由于没有机制来确定是否创建了已命名的系统互斥体,因此,当调用此构造函数重载时,最好将 initiallyOwned 指定为 false 如果需要确定初始所属权,可以使用 Mutex(Boolean, String, Boolean) 构造函数。

此构造函数初始化 Mutex 对象,该对象表示命名的互斥体。 您可以创建多个 Mutex 对象来表示同一个已命名的系统互斥体。

如果创建的已命名互斥体已经具备访问控制安全性,而调用方没有 MutexRights.FullControl,则会引发一个异常。 若要仅使用对线程活动进行同步所需的权限打开现有的已命名互斥体,请参见 OpenExisting 方法。

如果将 name 指定为 null 或空字符串,则创建一个局部互斥体,这和调用 Mutex(Boolean) 构造函数一样。 这种情况下,createdNew 始终为 true

由于已命名的互斥体是系统范围的,因此可以使用这些互斥体来协调跨进程边界的资源使用。

{如果mutext是未命名的则只能在同一个进程中被识别,无法应用于多个进程}

 

public Mutex(bool initiallyOwned,string name,out bool createdNew)

使用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值、一个作为互斥体名称的字符串,以及一个在方法返回时指示调用线程是否被授予互斥体的初始所属权的布尔值来初始化 Mutex 类的新实例。

参数

initiallyOwned
类型:System.Boolean
如果为 true,则给予调用线程已命名的系统互斥体的初始所属权(如果已命名的系统互斥体是通过此调用创建的);否则为 false
name
类型:System.String
Mutex 的名称。 如果值为 null,则 Mutex 是未命名的。 
createdNew
类型:System.Boolean%
在此方法返回时,如果创建了局部互斥体(即,如果 name  null 或空字符串)或指定的命名系统互斥体,则包含布尔值 true;如果指定的命名系统互斥体已存在,则为 false 该参数未经初始化即被传递。 

 

如果 name 不为 null  initiallyOwned  true,则只有当 createdNew 在调用后为 true 时,调用线程才拥有已命名的互斥体。 否则,此线程可通过调用 WaitOne 方法来请求互斥体。

此构造函数初始化 Mutex 对象,该对象表示命名的互斥体。 您可以创建多个 Mutex 对象来表示同一个已命名的系统互斥体。

如果创建的已命名互斥体已经具备访问控制安全性,而调用方没有 MutexRights.FullControl,则会引发一个异常。 若要仅使用对线程活动进行同步所需的权限打开现有的已命名互斥体,请参见 OpenExisting 方法。

如果将 name 指定为 null 或空字符串,则创建一个局部互斥体,这和调用 Mutex(Boolean) 构造函数一样。 这种情况下,createdNew 始终为 true

由于已命名的互斥体是系统范围的,因此可以使用这些互斥体来协调跨进程边界的资源使用。

public Mutex(bool initiallyOwned,string name,out bool createdNew,MutexSecurity mutexSecurity)

 

 

 

 

 

原创粉丝点击