NET多线程之进程间同步锁Mutex
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的更多相关文章
- 使用 Mutex 实现进程间同步
我们知道 Mutex 互斥量是可以用在线程间同步的,线程之间共享进程的数据,mutex 就可以直接引用.而进程有自己独立的内存空间,要怎样将它应用在进程间同步呢?为了达到这一目的,可以在 pthrea ...
- pthread mutex 进程间互斥锁实例
共享标志 定义 名称 描述 0 PTHREAD_PROCESS_PRIVATE 进程内互斥锁 仅可当前进程内共享 1 PTHREAD_PROCESS_SHARED 进程间互斥锁 多个进程间共享 第一个 ...
- Linux系统编程—进程间同步
我们知道,线程间同步有多种方式,比如:信号量.互斥量.读写锁,等等.那进程间如何实现同步呢?本文介绍两种方式:互斥量和文件锁. 互斥量mutex 我们已经知道了互斥量可以用于在线程间同步,但实际上,互 ...
- 一个进程间同步和通讯的 C# 框架
转自原文 一个进程间同步和通讯的 C# 框架 threadmsg_demo.zip ~ 41KB 下载 threadmsg_src.zip ~ 65KB 下载 0.背景简介 微软在 .NE ...
- python并发——进程间同步和通信
一.进程间同步 对于一些临界资源,不能使用并发无限消耗,就需要设置专门的临界标示,比如锁或者信号量等 from multiprocessing import Process, Lock import ...
- linux信号量之进程间同步
概念 linux信号量: 允许多个线程同时进入临界区,可以用于进程间的同步. 和互斥锁(mutex)的区别: 互斥锁只允许一个线程进入临界区. 所在头文件: semaphore.h 主要函数 初始化函 ...
- linux应用编程之进程间同步
一.描述 在操作系统中,异步并发执行环境下的一组进程,因为相互制约关系,进而互相发送消息.互相合作.互相等待,使得各进程按一定的顺序和速度执行,称为进程间的同步.具有同步关系的一组并发进程,称为合作进 ...
- 一起talk C栗子吧(第一百回:C语言实例--使用信号量进行进程间同步与相互排斥一)
各位看官们.大家好,上一回中咱们说的是进程间同步与相互排斥的样例,这一回咱们说的样例是:使用信号量进行进程间同步与相互排斥. 闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,信号量是由著名 ...
- Python并发编程-进程 线程 同步锁 线程死锁和递归锁
进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...
随机推荐
- Delphi中close与Terminate方法的区别
在有多个Form窗体时可以体现出来.用close是只关闭本窗体,而用Application.terminate是关闭整个程序,包括所有窗体.(1)当Close是一个主窗体时,程序会退出.Close会发 ...
- uwp开发————换背景图片
原文:uwp开发----换背景图片 用后台代码来实现对容器背景的切换,用本地图片作为背景. 把需要的图片素材放到Assets文件夹下 前台xaml代码如下: <Grid x:Name=" ...
- ExtJS 折线图趟过的坑
问题: 1.根据条件检索后绘制折线图,之前的坐标没有清除如图 解决方案: 在绘制之前,清空坐票: leftLine.surface.removeAll(); leftLine.redraw(false ...
- wchar_t string on Linux, OS X and Windows
Making wchar_t work on Linux, OS X and Windows for CMarkup release 10.1 I learned a couple of humble ...
- LockWindowUpdate
//锁住listview防止反复刷新 LockWindowUpdate(Self.lvsearch.Handle); 貌似不太行,多用几下就卡住了 那个函数几乎不用 ...
- 运维不仅仅是Linux,居然还要知道这么多?
摘要: 运维不仅仅是懂Linux就行,因为还有一大部分的Windows运维,向windows运维人员致敬.当然我们这篇文章不是说运维除了懂Linux,还要懂Windows,而是涉及运维的其他方方面面. ...
- nice-validator表单验证插件的简单使用
前言 前端表单校验是过滤无效数据.假数据.有毒数据的第一步,是数据安全的第一道关卡,虽然我们不能100%相信客户端提交的数据(真正的校验还得在服务端进行),但设置前端表单校验也是至关重要的,自己写逻辑 ...
- JVM(六):探究类加载过程-下
JVM(六):探究类加载过程-下 上文说了类加载过程的5个阶段,着重介绍了各个阶段做的工作.在本文中,我们对执行加载阶段的主体进行探讨,学习类加载器的模型和逻辑,以及我们该如何自定义一个类加载器. 定 ...
- win7 docker安装文件及安装问题
最近在玩爬虫,需要装docker,但是官网对于win7版本,只支持docker tool box,在官网找了半天才找到安装包,特此上传百度网盘,方便各位下载 链接:https://pan.baidu. ...
- SecureCRT的安装以及破破解(内含安装包)
1.百度网盘连接:链接:https://pan.baidu.com/s/13i8sblGthYtj2SbUTrbmsg 提取码:8cw1 2.解压前先关闭电脑防护软件,否则会杀掉破解软件的 3.压缩 ...