使用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,一经查实,立即删除!

相关文章

【NOIP模拟】开車【回退贪心】【multiset】

题意&#xff1a;有 1∼n1 \sim n1∼n nnn 个城市排成一行&#xff0c;给定每个城市的单位距离油价和两个城市间的距离、油箱容量&#xff0c;求 111 到 nnn 最小代价。 用 multiset 来维护当前油箱中的油的价格。 在每个城市假装把油加满。如果发现这个城市的油比油箱里的一…

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 [选…

CSP2020 赛前总结

比赛策略与思路 暴力不好写&#xff0c;没法对拍 ≠\neq​ 稳了签到题要求稳&#xff0c;可以当熟悉环境。但也要注意速度&#xff0c;为后面的题腾出时间。正解调不出来就写暴力&#xff0c;一是确认题意、换下脑筋&#xff0c;二是提供对拍&#xff0c;三是拿到保底分。正…

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

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

CSP-S 2020 游记

本博客建立于 2020 年 11 月 6 日晚&#xff0c;于次日正式认证后更新涉及题目的内容并公开。本人未提前知晓认证试题&#xff0c;请读者不必恐慌。 Day -4 久违地 AK 了一场模拟赛。 Day -2 因为模拟赛不给大样例&#xff0c;T3 T4都A了&#xff0c;反而挂了 SB 模拟和欧拉…

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…

【LOJ6072】苹果树【折半搜索】【矩阵树定理】【二项式反演】

题意&#xff1a;有好坏两种点共 nnn 个&#xff0c;每个好点有权值&#xff0c;把这 nnn 个点连成一棵树&#xff0c;一个好点为有用的当且仅当它至少与一个好点相邻&#xff0c;求所有有用的点的权值和不超过 limlimlim 的方案数。 n≤40n\leq 40n≤40 这题网上的容斥方法基…

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;大家似乎更愿意将其翻译成“上吊绳驱动开发”。这种开发模式是说在接到新…

【启智树NOIP模拟】奇偶【卢卡斯定理】【背包】【bitset】

题意&#xff1a;给定 nnn 个数 aia_iai​ &#xff0c;求选出&#xff08;可以重复&#xff0c;考虑顺序&#xff09;MMM 个数和为 SSS 的方案数模 222。 n≤200,ai≤105,M,S≤1018n\leq 200,a_i\leq 10^5,M,S\leq 10^{18}n≤200,ai​≤105,M,S≤1018 首先给每个数分配一个出…

「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集…

【启智树NOIP模拟】生存【父子分治】

题意&#xff1a;有 nnn 个城市连成一棵树&#xff0c;每个城市有 aia_iai​ 个人。接下来 mmm 天每天会发生 kik_iki​ 次灾难&#xff0c;每个灾难会让一个给定城市的人全部死掉。每个人一天可以走一条边&#xff0c;也可以不动。求最多多少人能活过这 mmm 天。 n≤106,∑ki≤…

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;我们需要保证这些放在不同物理机上的副本是一致的。为了…

【十二省联考2019】希望【点边容斥】【换根dp】【长链剖分】【线性数据结构】【回退数据结构】【离线逆元】

题意&#xff1a;给一棵树&#xff0c;两个参数 k,Lk,Lk,L,需要选择 kkk 个连通块&#xff0c;使得这 kkk 个连通块存在一个公共点&#xff0c;且该公共点到 kkk 个连通块内的任意一点的距离不超过 LLL&#xff0c;求方案数 模 998244353998244353998244353。两种方案不同当且仅…

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

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