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.数据 ...
随机推荐
- Win10《芒果TV》商店版更新v3.2.7:修复下载任务和会员下载权限异常
在第89届奥斯卡颁奖典礼,<爱乐之城>摘获最佳导演.女主.摄影等六项大奖,<月光男孩>爆冷获最佳影片之际,Win10版<芒果TV>迅速更新至v3.2.7,主要是修复 ...
- WPF 添加外部ResourceDirectory
如果Resource资源文件在程序集中,可直接如下将资源文件添加当当前运行时 Application.Current.Resources.MergedDictionaries.Add(new Reso ...
- LoadLibrary方法加载运行DLL库
最近和另一家公司对接,要求用对方提供的测试程序测试我们做的DLL. 接到对方的测试程序,发现和我们以前调用DLL的方式不太一样.但我稍微看了一会代码也看懂其意思了,一天搞定了. 但其中也遇到些小困惑, ...
- Qt 跨UI线程的数据交换和信号-槽调用实现方案汇总
一.目录 转载1: http://my.oschina.NET/fanhuazi/blog/737224?ref=myread 点击打开链接 转载2: http://www.qtcn.org/bbs/ ...
- Delphi xe5调用外部扫描程序——谷歌 zxing
unit uZXing; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Va ...
- C++ 使用回调函数的方式 和 作用。 持续更新
先看两个demo: 一.在类test1中调用函数print() ,把print()的函数指针传递给test1的函数指针参数 test1.h: #include <stdio.h> #inc ...
- github 上传更新代码(最简单的方法)
1.首先你需要一个github账号,还没有的朋友先去注册一个吧! GitHub地址:https://github.com/ 我们使用git需要先安装git工具,这里给出下载地址,下载后一路直接安装即可 ...
- 查看weblgic/Tuxedo/WebSpere(WAS)/Tomcat中间件版本
1.中间件 1.1 Weblogic WebLogic的版本信息.JDK信息.参数配置均可通过控制台查看. 软件版本 [命令]more /weblogic/bea/logs/log.tx ...
- vue注意项
1.通过官方vue生命周期图,总结其中的几个钩子函数 var vm = new Vue({ el: '#app', data: { }, beforeCreate() { alert('组件刚刚被创建 ...
- Java学习笔记-spring整合mybatis
这个项目就是一个例子,只有添加图书的功能: 项目架构: resource: 整合流程: 1.pom文件节点,这两个是整合用的,其他节点不再赘述: <!-- https://mvnreposito ...