Mutex类似于lock、Monitor,都是为了解决多线程环境下,资源竞争导致的访问顺序问题。常见资源竞争有以下情况:

1、单例,如何确保单例;

2、IO文件操作,如果同时又多个线程访问同一个文件会导致释放、内存溢出等问题;

3、变量脏读问题;

在开发过程中我们也常会有需求,一段代码、一个变量同一时刻只有一个线程在访问使用,其它线程排队等待,以杜绝资源竞争的问题。我们常用lock、Monitor只能用于同一进程的线程间同步。

而Mutex是用来解决统一操作系统,不同进程间的资源竞争问题。

namespace System.Threading
{
//
// 摘要:
// 还可用于进程间同步的同步基元。
[ComVisible(true)]
public sealed class Mutex : WaitHandle
{
//
// 摘要:
// 使用默认属性初始化 System.Threading.Mutex 类的新实例。
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[SecuritySafeCritical]
public Mutex();
//
// 摘要:
// 使用 Boolean 值(指示调用线程是否应具有互斥体的初始所有权)初始化 System.Threading.Mutex 类的新实例。
//
// 参数:
// initiallyOwned:
// 如果给调用线程赋予互斥体的初始所属权,则为 true;否则为 false。
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[SecuritySafeCritical]
public Mutex(bool initiallyOwned);
//
// 摘要:
// 使用 Boolean 值(指示调用线程是否应具有互斥体的初始所有权以及字符串是否为互斥体的名称)初始化 System.Threading.Mutex 类的新实例。
//
// 参数:
// initiallyOwned:
// 如果为 true,则给予调用线程已命名的系统互斥体的初始所属权(如果已命名的系统互斥体是通过此调用创建的);否则为 false。
//
// name:
// System.Threading.Mutex 的名称。 如果值为 null,则 System.Threading.Mutex 是未命名的。
//
// 异常:
// T:System.UnauthorizedAccessException:
// 命名互斥体存在且具有访问控制安全性,但用户不具备 System.Security.AccessControl.MutexRights.FullControl。
//
// T:System.IO.IOException:
// 出现 Win32 错误。
//
// T:System.Threading.WaitHandleCannotBeOpenedException:
// 无法创建命名互斥体,可能是由于其他类型的等待句柄具有相同名称。
//
// T:System.ArgumentException:
// name 超过 260 个字符。
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[SecurityCritical]
public Mutex(bool initiallyOwned, string name);
//
// 摘要:
// 使用可指示调用线程是否应具有互斥体的初始所有权以及字符串是否为互斥体的名称的 Boolean 值和当线程返回时可指示调用线程是否已赋予互斥体的初始所有权的
// Boolean 值初始化 System.Threading.Mutex 类的新实例。
//
// 参数:
// initiallyOwned:
// 如果为 true,则给予调用线程已命名的系统互斥体的初始所属权(如果已命名的系统互斥体是通过此调用创建的);否则为 false。
//
// name:
// System.Threading.Mutex 的名称。 如果值为 null,则 System.Threading.Mutex 是未命名的。
//
// createdNew:
// 在此方法返回时,如果创建了局部互斥体(即,如果 name 为 null 或空字符串)或指定的命名系统互斥体,则包含布尔值 true;如果指定的命名系统互斥体已存在,则为
// false。 此参数未经初始化即被传递。
//
// 异常:
// T:System.UnauthorizedAccessException:
// 命名互斥体存在且具有访问控制安全性,但用户不具备 System.Security.AccessControl.MutexRights.FullControl。
//
// T:System.IO.IOException:
// 出现 Win32 错误。
//
// T:System.Threading.WaitHandleCannotBeOpenedException:
// 无法创建命名互斥体,可能是由于其他类型的等待句柄具有相同名称。
//
// T:System.ArgumentException:
// name 超过 260 个字符。
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[SecurityCritical]
public Mutex(bool initiallyOwned, string name, out bool createdNew);
//
// 摘要:
// 使用可指示调用线程是否应具有互斥体的初始所有权以及字符串是否为互斥体的名称的 Boolean 值和当线程返回时可指示调用线程是否已赋予互斥体的初始所有权以及访问控制安全是否已应用到命名互斥体的
// Boolean 变量初始化 System.Threading.Mutex 类的新实例。
//
// 参数:
// initiallyOwned:
// 如果为 true,则给予调用线程已命名的系统互斥体的初始所属权(如果已命名的系统互斥体是通过此调用创建的);否则为 false。
//
// name:
// 系统互斥体的名称。 如果值为 null,则 System.Threading.Mutex 是未命名的。
//
// createdNew:
// 在此方法返回时,如果创建了局部互斥体(即,如果 name 为 null 或空字符串)或指定的命名系统互斥体,则包含布尔值 true;如果指定的命名系统互斥体已存在,则为
// false。 此参数未经初始化即被传递。
//
// mutexSecurity:
// System.Security.AccessControl.MutexSecurity 对象,表示应用于已命名的系统互斥体的访问控制安全性。
//
// 异常:
// T:System.IO.IOException:
// 出现 Win32 错误。
//
// T:System.UnauthorizedAccessException:
// 命名互斥体存在且具有访问控制安全性,但用户不具备 System.Security.AccessControl.MutexRights.FullControl。
//
// T:System.Threading.WaitHandleCannotBeOpenedException:
// 无法创建命名互斥体,可能是由于其他类型的等待句柄具有相同名称。
//
// T:System.ArgumentException:
// name 超过 260 个字符。
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[SecurityCritical]
public Mutex(bool initiallyOwned, string name, out bool createdNew, MutexSecurity mutexSecurity); //
// 摘要:
// 打开指定的已命名的互斥体(如果已经存在)。
//
// 参数:
// name:
// 要打开的系统互斥体的名称。
//
// 返回结果:
// 表示已命名的系统互斥体的对象。
//
// 异常:
// T:System.ArgumentException:
// name 是一个空字符串。 - 或 - name 超过 260 个字符。
//
// T:System.ArgumentNullException:
// name 为 null。
//
// T:System.Threading.WaitHandleCannotBeOpenedException:
// 已命名的互斥体不存在。
//
// T:System.IO.IOException:
// 出现 Win32 错误。
//
// T:System.UnauthorizedAccessException:
// 已命名的互斥体存在,但用户没有使用它所需的安全访问权限。
[SecurityCritical]
public static Mutex OpenExisting(string name);
//
// 摘要:
// 利用所需的安全访问权限,打开指定的已命名的互斥体(如果已经存在)。
//
// 参数:
// name:
// 要打开的系统互斥体的名称。
//
// rights:
// 表示所需的安全访问权限的枚举值的按位组合。
//
// 返回结果:
// 表示已命名的系统互斥体的对象。
//
// 异常:
// T:System.ArgumentException:
// name 是一个空字符串。 - 或 - name 超过 260 个字符。
//
// T:System.ArgumentNullException:
// name 为 null。
//
// T:System.Threading.WaitHandleCannotBeOpenedException:
// 已命名的互斥体不存在。
//
// T:System.IO.IOException:
// 出现 Win32 错误。
//
// T:System.UnauthorizedAccessException:
// 已命名的互斥体存在,但用户不具有所需的安全访问权限。
[SecurityCritical]
public static Mutex OpenExisting(string name, MutexRights rights);
//
// 摘要:
// 打开指定的已命名的互斥体(如果已经存在),并返回指示操作是否成功的值。
//
// 参数:
// name:
// 要打开的系统互斥体的名称。
//
// result:
// 当此方法返回时,如果调用成功,则包含表示命名互斥体的 System.Threading.Mutex 对象;否则为 null。 该参数未经初始化即被处理。
//
// 返回结果:
// 如果命名互斥体成功打开,则为 true;否则为 false。
//
// 异常:
// T:System.ArgumentException:
// name 是一个空字符串。 - 或 - name 超过 260 个字符。
//
// T:System.ArgumentNullException:
// name 为 null。
//
// T:System.IO.IOException:
// 出现 Win32 错误。
//
// T:System.UnauthorizedAccessException:
// 存在命名的互斥,但用户没有使用它时所需的安全访问权限。
[SecurityCritical]
public static bool TryOpenExisting(string name, out Mutex result);
//
// 摘要:
// 利用所需的安全访问权限,打开指定的已命名的互斥体(如果已经存在),并返回指示操作是否成功的值。
//
// 参数:
// name:
// 要打开的系统互斥体的名称。
//
// rights:
// 表示所需的安全访问权限的枚举值的按位组合。
//
// result:
// 当此方法返回时,如果调用成功,则包含表示命名互斥体的 System.Threading.Mutex 对象;否则为 null。 该参数未经初始化即被处理。
//
// 返回结果:
// 如果命名互斥体成功打开,则为 true;否则为 false。
//
// 异常:
// T:System.ArgumentException:
// name 是一个空字符串。 - 或 - name 超过 260 个字符。
//
// T:System.ArgumentNullException:
// name 为 null。
//
// T:System.IO.IOException:
// 出现 Win32 错误。
//
// T:System.UnauthorizedAccessException:
// 存在命名的互斥,但用户没有使用它时所需的安全访问权限。
[SecurityCritical]
public static bool TryOpenExisting(string name, MutexRights rights, out Mutex result);
//
// 摘要:
// 获取表示已命名的互斥体的访问控制安全性的 System.Security.AccessControl.MutexSecurity 对象。
//
// 返回结果:
// 表示已命名的互斥体的访问控制安全性的 System.Security.AccessControl.MutexSecurity 对象。
//
// 异常:
// T:System.UnauthorizedAccessException:
// 当前 System.Threading.Mutex 对象都表示一个已命名的系统互斥体,但用户不具有 System.Security.AccessControl.MutexRights.ReadPermissions。
// - 或 - 当前 System.Threading.Mutex 对象表示已命名的系统互斥体,并不是以 System.Security.AccessControl.MutexRights.ReadPermissions。
//
// T:System.NotSupportedException:
// 不支持 Windows 98 或 Windows Millennium Edition。
[SecuritySafeCritical]
public MutexSecurity GetAccessControl();
//
// 摘要:
// 释放 System.Threading.Mutex 一次。
//
// 异常:
// T:System.ApplicationException:
// 调用线程不拥有互斥体。
//
// T:System.ObjectDisposedException:
// 已释放当前实例。
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[SecuritySafeCritical]
public void ReleaseMutex();
//
// 摘要:
// 设置已命名的系统互斥体的访问控制安全性。
//
// 参数:
// mutexSecurity:
// System.Security.AccessControl.MutexSecurity 对象,表示应用于已命名的系统互斥体的访问控制安全性。
//
// 异常:
// T:System.ArgumentNullException:
// mutexSecurity 为 null。
//
// T:System.UnauthorizedAccessException:
// 用户不具有 System.Security.AccessControl.MutexRights.ChangePermissions。 - 或 - 互斥体不是以
// System.Security.AccessControl.MutexRights.ChangePermissions。
//
// T:System.SystemException:
// 当前 System.Threading.Mutex 对象不表示已命名的系统互斥体。
[SecuritySafeCritical]
public void SetAccessControl(MutexSecurity mutexSecurity);
}
}

  

NET多线程之进程间同步锁Mutex的更多相关文章

  1. 使用 Mutex 实现进程间同步

    我们知道 Mutex 互斥量是可以用在线程间同步的,线程之间共享进程的数据,mutex 就可以直接引用.而进程有自己独立的内存空间,要怎样将它应用在进程间同步呢?为了达到这一目的,可以在 pthrea ...

  2. pthread mutex 进程间互斥锁实例

    共享标志 定义 名称 描述 0 PTHREAD_PROCESS_PRIVATE 进程内互斥锁 仅可当前进程内共享 1 PTHREAD_PROCESS_SHARED 进程间互斥锁 多个进程间共享 第一个 ...

  3. Linux系统编程—进程间同步

    我们知道,线程间同步有多种方式,比如:信号量.互斥量.读写锁,等等.那进程间如何实现同步呢?本文介绍两种方式:互斥量和文件锁. 互斥量mutex 我们已经知道了互斥量可以用于在线程间同步,但实际上,互 ...

  4. 一个进程间同步和通讯的 C# 框架

    转自原文 一个进程间同步和通讯的 C# 框架 threadmsg_demo.zip ~ 41KB    下载 threadmsg_src.zip ~ 65KB    下载 0.背景简介 微软在 .NE ...

  5. python并发——进程间同步和通信

    一.进程间同步 对于一些临界资源,不能使用并发无限消耗,就需要设置专门的临界标示,比如锁或者信号量等 from multiprocessing import Process, Lock import ...

  6. linux信号量之进程间同步

    概念 linux信号量: 允许多个线程同时进入临界区,可以用于进程间的同步. 和互斥锁(mutex)的区别: 互斥锁只允许一个线程进入临界区. 所在头文件: semaphore.h 主要函数 初始化函 ...

  7. linux应用编程之进程间同步

    一.描述 在操作系统中,异步并发执行环境下的一组进程,因为相互制约关系,进而互相发送消息.互相合作.互相等待,使得各进程按一定的顺序和速度执行,称为进程间的同步.具有同步关系的一组并发进程,称为合作进 ...

  8. 一起talk C栗子吧(第一百回:C语言实例--使用信号量进行进程间同步与相互排斥一)

    各位看官们.大家好,上一回中咱们说的是进程间同步与相互排斥的样例,这一回咱们说的样例是:使用信号量进行进程间同步与相互排斥. 闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,信号量是由著名 ...

  9. Python并发编程-进程 线程 同步锁 线程死锁和递归锁

    进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...

随机推荐

  1. CSS技巧分享:如何用css制作横排二级下拉菜单

    原文:CSS技巧分享:如何用css制作横排二级下拉菜单 导航菜单是每个网站所必备的功能,也是每个学习制作网站的朋友所必须接触的,如何用css样式制作一个简单漂亮的二级下拉菜单呢,下来小编就一步一步教大 ...

  2. C#二分查找法 破洞百出版本

    二分查找法在数据繁多的数据中查找是一种快速的方法,每次查找最多需要的次数 为2的n次方小于总个数. 当然是有前提的,就是需要把数据先排好序,这里指的都是数值型的数据. 基本思想就是把需要找的值与排序好 ...

  3. PyCharm安装MicroPython插件

    转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 前言 PyCharm可以说是当今最流行的一款Pyth ...

  4. VC6下 try catch 在release下的杯具(默认情况下,要加上throw语句catch才不会被优化掉)

    IDE:VC6 今天遇到一个小问题,把我郁闷了好久,××医生的VulEngine不时在wcsstr处发生crash,加了一番强大的参数检查后,再加上了强大的try catch,其实不是很喜欢用try和 ...

  5. Vbox中Linux虚拟机网络配置(比较实用)

    好久没写过东西了,主要大部分都是来自对生活的感悟,很少有实实在在的关于学得有成就感的技术可以“炫耀”,所以也就懒得在这个上面登了. 实验室很早就有位师兄曾在吃饭的路上问过我们这群小弟,你们知道Vbox ...

  6. Markdown教程<2> mermaid图形绘制(1)

    Markdown教程<2> mermaid图形绘制(1) 博客园中的markdown编辑器同时支持mermaid图表引擎与tex公式引擎,可以使用mermaid直接画出流程图,时序图,甘特 ...

  7. RocketMQ(5)---RocketMQ重试机制

    RocketMQ重试机制 消息重试分为两种:Producer发送消息的重试 和 Consumer消息消费的重试. 一.Producer端重试 Producer端重试是指: Producer往MQ上发消 ...

  8. CTF干货合集

    CTF练习平台 http://hackinglab.cn/ 网络信息安全攻防学习平台 http://captf.com/ ctf题目 http://oj.xctf.org.cn/ XCTF_OJ练习平 ...

  9. 为什么现在这么多人开始学习Python?

    近几年Python编程语言在国内引起不小的轰动,有超越JAVA之势,本来在美国这个编程语言就是最火的,应用的非常非常的广泛,而Python的整体语言难度来讲又比JAVA简单的很多.尤其在运维的应用中非 ...

  10. html更改弹窗样式(原创,转载需声明)

    代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <tit ...