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. Win10《芒果TV》更新v3.8.40青春版:优化推送策略、新增缓存清理

    芒果TV暑期重磅活动-青春芒果节拉开帷幕,炫酷的3D视觉大秀.王牌IP互动体验馆.众星云集的青春炙燥夜晚会.神秘的芒果吉祥物发布,Win10版<芒果TV>全平台同步更新青春版v3.8.40 ...

  2. Qt 5.9对Mac的图形显示有许多改进

    We have some platform specific improvements as well as support for new platforms and compilers comin ...

  3. SQLServer2005数据库快照的简单使用

    原文:SQLServer2005数据库快照的简单使用                                                  SQLServer2005数据库快照的简单使用 ...

  4. 【转】ORACLE AWR报告

    转自:http://blog.csdn.net/liqfyiyi/article/details/8236864 About Oracle AWR Oracle AWR is a powerful m ...

  5. QString之simplified()用于读取数据、规范数据,非常方便

    在工程项目开发中,遇到这么个问题:手工计入文件中的数据,每行有三个,前两个是数字,最后一个是标识,现在把这3个数据提取出来. 一提取就出现问题了:由于手工导入,数据间使用空白间隔,有可能是一个空格,有 ...

  6. Ring3下无驱动移除winlogon.exe进程ctrl+alt+del,win+u,win+l三个系统热键,非屏蔽热键(子类化SAS 窗口)

    随手而作,纯粹技术研究,没什么实际意义. 打开xuetr,正常情况下.winlogon.exe注册了三个热键.ctrl+alt+del,win+u,win+l三个. 这三个键用SetWindowsHo ...

  7. 记住以下10条,Linux磁盘与文件系统管理无忧矣

    1.查看当前Linux系统所支持的文件系统:ls -l /lib/modules/$(uname -r)/kernel/fs:目前已加载到内存中支持的文件系统:cat /proc/filesystem ...

  8. 判断一个窗口是否被挂起(发WM_NULL消息,或者调用IsHungAppWindow API进行测试)

    判断一个窗口是否被挂起了(就是没有响应了),在多窗口编程了经常会用到,在给别的窗口发消息前,为了目的窗口能确定收到消息,常常在之前先检测窗口是否被挂起了,我们以前常用的方式的是使用下面的方法: //  ...

  9. 数组Array

    数组Array是最基本的数据结构,在内存中为一段定长连续内存,很多编程语言都有实现. 一.一维数组 下面代码实现了一维数组和它的遍历. clear并非清空数组,而是采用具体值对数组进行初始化. imp ...

  10. spring boot 2.x 系列 —— spring boot 实现分布式 session

    文章目录 一.项目结构 二.分布式session的配置 2.1 引入依赖 2.2 Redis配置 2.3 启动类上添加@EnableRedisHttpSession 注解开启 spring-sessi ...