使用Mutex进行线程处理


640?wx_fmt=jpeg

Mutex就像一个C#锁(lock),但它可以跨多个进程工作。换句话说,Mutex可以是计算机范围的,也可以是应用程序范围的。


Mutex是一个同步原语,也可用于进程间同步。当两个或多个线程需要同时访问共享资源时,系统需要一个同步机制来确保一次只有一个线程使用该资源。Mutex是一个同步原语,它只允许对一个线程的共享资源进行独占访问。如果一个线程获得了一个Mutex,那么想要获取该Mutex的第二个线程将被挂起,直到第一个线程释放Mutex。

简而言之,互斥(“Mutex”)是一种机制,它充当一个标志,以防止两个线程同时执行一个或多个操作。您想要独占运行的整个操作称为关键部分或受保护部分。

关键部分是访问共享资源(数据结构或设备)的一段代码,但条件是一次只能有一个线程进入此部分。

现代编程语言天生就支持这一点。。在C#中,像下面这样简单:

  • 实例化可从每个线程访问的新静态Mutex对象。

  • 在每个线程中使用该对象的WaitOne()和ReleaseMutex()方法包装您想要在关键部分执行的任何代码

使用Mutex类,您可以调用WaitHandle.WaitOne方法加锁,用ReleaseMutex释放这个锁。关闭或dispose Mutex会自动释放它。与lock语句一样,Mutex只能从获取它的同一个线程中释放。

以下示例显示如何使用本地Mutex对象来同步对受保护资源的访问。

using System;  	
using System.Collections;  	
using System.Threading;  	
namespace Mutexclass  	
{  	
class Akshay  	{  	private static Mutex mutex = new Mutex();  	private const int numhits = 1;  	private const int numThreads = 4;  	private static void ThreadProcess()  	{  	for (int i = 0; i < numhits; i++)  	{  	UseCsharpcorner();  	}  	}  	private static void UseCsharpcorner()  	{  	mutex.WaitOne();   // Wait until it is safe to enter.  	Console.WriteLine("{0} has entered in the C_sharpcorner.com",  	Thread.CurrentThread.Name);  	// Place code to access non-reentrant resources here.  	Thread.Sleep(500);    // Wait until it is safe to enter.  	Console.WriteLine("{0} is leaving the C_sharpcorner.com\r\n",  	Thread.CurrentThread.Name);  	mutex.ReleaseMutex();    // Release the Mutex.  	}  	static void Main(string[] args)  	{  	for (int i = 0; i < numThreads; i++)  	{  	Thread mycorner = new Thread(new ThreadStart(ThreadProcess));  	mycorner.Name = String.Format("Thread{0}", i + 1);  	mycorner.Start();  	}  	Console.Read();  	}  	}  	
}

640?wx_fmt=png

用Mutex来控制针对两个当前线程的共享资源

using System;  	
using System.Threading;  	
class MyCounter  	
{  	public static int count = 0;  	public static Mutex MuTexLock = new Mutex();  	
}  	
class IncThread  	
{  	public Thread th;  	public IncThread()  	{  	th = new Thread(this.GO);  	th.Start();  	}  	void Go()  	{  	Console.WriteLine("IncThread is waiting for the mutex.");  	MyCounter.MuTexLock.WaitOne();  	Console.WriteLine("IncThread acquires the mutex.");  	int num = 10;  	do  	{  	Thread.Sleep(50);  	MyCounter.count++;  	Console.WriteLine("In IncThread, MyCounter.count is " + MyCounter.count);  	num--;  	} while (num > 0);  	Console.WriteLine("IncThread releases the mutex.");  	MyCounter.MuTexLock.ReleaseMutex();  	}  	
}  	
class DecThread  	
{  	public Thread th;  	public DecThread()  	{  	th = new Thread(new ThreadStart(this.Go));  	th.Start();  	}|  	void Go()  	
|    {  	Console.WriteLine("DecThread is waiting for the mutex.");  	MyCounter.MuTexLock.WaitOne();  	Console.WriteLine("DecThread acquires the mutex.");  	int num = 10;  	do  	{  	Thread.Sleep(50);  	MyCounter.count--;  	Console.WriteLine("In DecThread, MyCounter.count is " + MyCounter.count);  	num--;  	} while (num > 0);  	Console.WriteLine("DecThread releases the mutex.");  	MyCounter.MuTexLock.ReleaseMutex();  	}  	
}  	
class MainClass  	
{  	public static void Main()  	{|  	IncThread myt1 = new IncThread();  	DecThread myt2 = new DecThread();  	myt1.thrd.Join();  	myt2.thrd.Join();  	Console.Read();  	}  	
}

640?wx_fmt=png

使用Mutex对象:WaitOne


重载的WaitOne()方法也接受TimeSpan对象,如果线程需要等待一段时间后执行的场景很有用。通常,当存在当两个或多个线程正在等待同一个互斥锁同时可用导致死锁的风险时使用此方法,。死锁听起来很糟糕,因为它可能导致应用程序互相等待导致而出现无响应或者超时。


using System;  	
using System.Threading;  	
namespace waitonmethod  	
{  	
class Akshay  	{  	private static int Runs = 0;  	static Mutex mutex = new Mutex(false, "RunsMutex");|  	public static void CountUp()  	{  	while (Runs < 10)  	{  	// acquire the mutex  	mutex.WaitOne();  	int Temp = Runs;  	Temp++;  	Console.WriteLine(Thread.CurrentThread.Name + " " + Temp);  	Thread.Sleep(800);  	Runs = Temp;  	// release the mutex  	mutex.ReleaseMutex();  	}  	}  	public static void Main()  	{  	Thread t2 = new Thread(new ThreadStart(CountUp));  	t2.Name = "t2";  	Thread t3 = new Thread(new ThreadStart(CountUp));  	t3.Name = "t3";  	t2.Start();  	t3.Start();  	Console.Read();  	}  	}  	
}


640?wx_fmt=png


得到互斥锁

互斥对象由线程拥有。当拥有时,它只能由一个线程拥有。当它由一个线程拥有时,在原始线程所有者释放它之前,其他线程不能拥有它。想要拥有互斥对象的线程调用互斥对象实例的WaitOne()方法。想要释放互斥锁的拥有线程调用ReleaseMutex()方法。


using System;  	
using System.Threading;  	
namespace ownamutex  	
{  	class Akshay  	{  	public static void Main()  	{  	bool ownsMutex;  	using (Mutex mutex = new Mutex(true, "MutexExample", out ownsMutex))  	{  	if (ownsMutex)  	{  	Console.WriteLine("Owned");  	mutex.ReleaseMutex();  	}  	else  	{  	Console.WriteLine("Another instance of this application " +" already owns the mutex named MutexExample.");  	}  	}  	Console.Read();  	}  	}  	
}

640?wx_fmt=png

命名Mutex

Mutex可以取别名,也可以默认。如果对互斥锁命名,那么它就有资格成为可以从多个进程访问的系统级别的互斥锁。如果互斥锁未命名,则它是一个匿名互斥锁,只能在创建互斥锁的进程内访问。

 

using System;  	
using System.Threading;  	
namespace Namingthread  	
{  	class Akshay  	{   	public static void Main(string[] args)  	{  	string mutexName = "akshay";  	Mutex m = new Mutex(false, mutexName);  	for (; ; )  	{  	m.WaitOne();  	Console.WriteLine("Have Mutex");  	Console.WriteLine("Releasing");  	m.ReleaseMutex();  	}  	Console.Read();  	}  	}  	
}


640?wx_fmt=png



https://www.c-sharpcorner.com/UploadFile/1d42da/threading-with-mutex/

Akshay Teotia C# Corner

https://pdfs.semanticscholar.org/326a/0e09be808978c3bb9fdd006f3041dc0cbc13.pdf

Runtime Code Generation with JVM and CLR















本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Educational Codeforces Round 75 (Rated for Div. 2) D. Salary Changing 二分 + check

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 直接算不好算&#xff0c;考虑二分这个中位数midmidmid。 考虑如何checkcheckcheck&#xff0c;这个分情况来就好了&#xff1a; (1)mid>a[i].r(1)mid>a[i].r(1)mid>a[i].r&#…

【Linux】Linux常见指令解析上

目录 1. 前言2. ls指令3. pwd指令4. cd指令3.1 cd常见快捷指令 4. touch指令5. mkdir指令6. rmdir指令 && rm指令 &#xff08;重要&#xff09;6.1 rmdir指令6.2 rm指令 7. man指令 1. 前言 这篇文章我们将详细介绍一下Linux下常见的基本指令。 2. ls指令 语法: ls [选…

PYPL 7月榜单公布:Java份额出现下降趋势

PYPL(PopularitY of Programming Language&#xff0c;编程语言流行指数) 7 月份的榜单已发布&#xff0c;目前包含四个排行榜&#xff0c;囊括编程语言、IDE、ODE(Online IDE) 以及数据库四大领域。PYPL 是非常流行的参考指标&#xff0c;其榜单数据的排名均是根据榜单对象在 …

Codeforces Round #593 (Div. 2) D. Alice and the Doll 暴力 + 二分

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 还以为这个题有什么高深的算法&#xff0c;结果就是个暴力。 由于n∗mn*mn∗m达到了1e101e101e10的级别&#xff0c;所以直接暴力肯定是不行的&#xff0c;考虑有很多空格&#xff0c;我们…

远古魔力 | 在Windows 10和Azure App Service里跑上世纪的ASP

ASP&#xff08;没有.NET&#xff09; 即 Active Server Pages &#xff08;动态服务器页面&#xff09;是一项由微软公司在1996年推出的技术&#xff0c;能够在IIS中运行动态网站。也许许多90后及千禧一代程序员并没有听说过它&#xff0c;但很多老程序员曾经用ASP编写了诸如D…

P2375 [NOI2014] 动物园 kmp fail指针/倍增

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 由kmpkmpkmp中失配数组nenene的含义我们知道&#xff0c;ne[i],ne[ne[i]],...ne[i],ne[ne[i]],...ne[i],ne[ne[i]],...都是iii的相等的前后缀&#xff0c;但是可能有重叠的部分&#xff0c…

DDD“上吊绳驱动开发”,开发要想不被“吊死”,该如何自救?

话题缘起01今天在DevOps案例深度研究讨论群里&#xff0c;群友们围绕一种开发模式展开了讨论&#xff1a;DDD&#xff08;Deadline Driven Development&#xff09;&#xff0c;期限驱动开发&#xff0c;大家似乎更愿意将其翻译成“上吊绳驱动开发”。这种开发模式是说在接到新…

「Sqlserver」数据分析师有理由爱Sqlserver-好用的插件工具推荐

在此系列中&#xff0c;笔者为大家带来一些以数据分析师视角去使用Sqlserver的系列文章&#xff0c;希望笔者走过的路能够给后来者带来一些便利。背景介绍在数据分析师的角色下&#xff0c;使用数据库更多的是为了从数据库中获取数据&#xff0c;和数据库交互的语言是SQL&#…

P4824 [USACO15FEB]Censoring S kmp + 栈

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 如果删除之后两个串不拼起来就是个裸kmpkmpkmp了&#xff0c;但是这个题能拼起来&#xff0c;拼起来之后还有可能生成一个新的串&#xff0c;而且起点在当前位置之前。 考虑是否能找到删掉…

使用kubectl管理k8s集群(三十)

前言Foreword在搭建k8s集群之前&#xff0c;我们需要先了解下kubectl的使用&#xff0c;以便在集群部署出现问题时进行检查和处理。命令和语法记不住没有关系&#xff0c;但是请记住主要的语法和命令以及帮助命令的使用。在下一篇&#xff0c;我们将讲述使用Kubeadm来创建k8s集…

P3435 [POI2006]OKR-Periods of Words kmp + fail指针

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 转换一下题意&#xff0c;就是求一个最小公共前后缀&#xff0c;显然可以暴跳nenene数组&#xff0c;复杂度O(n2)O(n^2)O(n2)&#xff0c;注意到我们每次都跳的话会跳到很多重复的位置&…

架构杂谈《四》

分布式一致性协议一、引言在分布式系统中&#xff0c;为了保证数据的高可用&#xff0c;通常会将数据保留多个副本(replica)&#xff0c;这些个副本会放在不同的物理机上&#xff0c;为了对用户提供正确的数据&#xff0c;我们需要保证这些放在不同物理机上的副本是一致的。为了…

Codeforces Round #246 (Div. 2) D. Prefixes and Suffixes kmp + dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 通过完美子串的定义&#xff0c;我们不难发现满足条件的子串就是kmpkmpkmp中ne[n]ne[n]ne[n]不断向前跳得到的串&#xff0c;现在问题就是如何求这些前缀串在串中出现的次数了。 考虑一个前…

译 | 宣布ML.NET 1.2 及模型生成器更新(用于 .NET 的机器学习)

原文&#xff1a;Cesar De la Torre翻译&#xff1a;Edi Wang我们很高兴地宣布ML.NET 1.2 和模型生成器和 CLI 的更新。ML.NET是 .NET 开发人员的开源和跨平台机器学习框架。ML.NET还包括模型生成器(Visual Studio 的简单 UI 工具)和ML.NET CLI(命令行界面),以便使用自动机器学…

Codeforces Round #590 (Div. 3) F. Yet Another Substring Reverse 子集dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 之前做过类似的题&#xff0c;翻转一个字串相当于将任意两个不相交的串连在一起。再一看字符集≤20\le20≤20&#xff0c;那就是铁子集dpdpdp了。 定义f[i]f[i]f[i]表示状态为iii的串的长度…

一个超轻量级工作流引擎:Workflow-Core

近期工作上有一个工作流的开发需求&#xff0c;自己基于面向对象和职责链模式捣鼓了一套小框架&#xff0c;后来在github上发现一个轻量级的工作流引擎轮子&#xff1a;Workflow-Core&#xff0c;看完其wiki之后决定放弃之前自己造的轮子&#xff0c;使用这个开源项目来改造&am…

Codeforces Round #590 (Div. 3) E. Special Permutations 差分 + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 直接考虑比较难想&#xff0c;这种公式题基本都是将部分答案看成一个整体&#xff0c;考虑xi,xi1x_i,x_{i1}xi​,xi1​的贡献的。 假设当前的xix,xi1y,x<yx_ix,x_{i1}y,x<yxi​x,xi1…

ASP.NET Core 3.0中支持AI的生物识别安全

本文共两个部分&#xff0c;这是第一部分&#xff0c;其中介绍了 ASP.NET Core 3 中旨在将授权逻辑与基本的用户角色相分离的基于策略的授权模型。此部分提供了此授权进程的基于生物识别信息&#xff08;如人脸识别或语音识别&#xff09;的具体示例。在此示例中&#xff0c;检…

架构杂谈《五》

保证最终一致性的模式在大规模、高并发服务化系统中&#xff0c;一个功能被拆分成多个具有功能单一的子功能&#xff0c;一个流程会有多个系统的多个单一功能的服务组合实现&#xff0c;如果使用两阶段提交协议和三阶段提交协议&#xff0c;确实能解决系统间的一致性问题。其实…

在Linux的Windows子系统上(WSL)使用Docker(Ubuntu)

背景平时开发大部人都是在提供了高效GUI的window下工作&#xff0c;但是真正部署环境普遍都是在Linux中&#xff0c;所以为了让开发环境和部署环境统一&#xff0c;我们需要在windows模拟LInux环境&#xff0c;以前我们可能通过虚拟机的方式实现&#xff0c;不过自从微软拥抱开…