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.数据 ...
随机推荐
- apache本地服务器的配置流程
安装Apache 一.目的: 1. 能够有一个测试的服务器,不是所有的特殊网络服务都能找到免费的! 二.为什么是 "Apache" 1. 使用最广的 Web 服务器 2. Mac自 ...
- Java HashMap实现原理 源码剖析
HashMap是基于哈希表的Map接口实现,提供了所有可选的映射操作,并允许使用null值和null建,不同步且不保证映射顺序.下面记录一下研究HashMap实现原理. HashMap内部存储 在Ha ...
- Android多线程(二)
在上一篇中,我简单说了用AsyncTask来完成简单异步任务,但AsyncTask是把所有的异步任务放到一个队列中依次在同一个线程中执行.这样就带来一个问题,它无法处理那些耗时长.需要并行的的任务.如 ...
- cStor云存储、cProc云处理、cVideo云视频、cTrans云传输,云创个人网盘
http://www.cstor.cn,微信公众号:cstor_cn. 云创大数据是国际上云计算产品线齐全的企业之一,针对爆炸式增长的大数据需求,研发了自主知识产权的cStor云存储.cPr ...
- WSAAsyncSelect Demo
#include <WinSock2.h> #include <Windows.h> #include <StrSafe.h> #pragma comment(li ...
- IIS6利用URLScan修复IIS短文件名漏洞
一.下载URLScan 3.1 链接: http://pan.baidu.com/s/1i4HfKrj 密码: dmud 二.安装URLScan 3.1 安装完成以后,我们可以在System32/In ...
- TopFreeTheme精选免费模板【20130626】
有一段时间没有发布的模板了,相信很多喜欢新模板的朋友有点焦急了!还好,今天我今天整理了13个最新的模板,主要是WordPress的,另外3个是关于Joomla的模板,他们分别是游戏主题.俱乐部主题以及 ...
- 补习系列(21)-SpringBoot初始化之7招式
目录 背景 1. @PostConstruct 注解 2. InitializingBean 接口 3. @Bean initMethod方法 4. 构造器注入 5. ApplicationListe ...
- Kafka 学习之路(三)—— Kafka生产者详解
一.生产者发送消息的过程 首先介绍一下Kafka生产者发送消息的过程: Kafka会将发送消息包装为ProducerRecord对象, ProducerRecord对象包含了目标主题和要发送的内容,同 ...
- MyBatis从入门到精通(四):MyBatis XML方式的基本用法之增删改
最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 1. insert用法 1.1 简单的 ...