ReleaseMutex用法

ReleaseMutex用法Mutex中提供了WiteOne,ReleaseMutex两个实例方法~WiteOne的作用是”阻塞当前线程,提供对该线程的原子操作”也就是说当一个线程遇到WiteOne的时候,如果在WiteOne里面没有线程在操作,则此线程进去操作而里面有线程的时候,所有到此的线程均需要排队等候里面的线程执行完毕~而控制这样操作的结束标记就是使用ReleaseMutex方法!就好比WiteO…

大家好,又见面了,我是你们的朋友全栈君。

Mutex中提供了WiteOne,ReleaseMutex 两个实例方法~

WiteOne的作用是”阻塞当前线程,提供对该线程的原子操作”

也就是说当一个线程遇到WiteOne的时候,如果在WiteOne里面没有线程在操作,则此线程进去操作

而里面有线程的时候,所有到此的线程均需要排队等候里面的线程执行完毕~

而控制这样操作的结束标记就是使用ReleaseMutex 方法!

就好比WiteOne是一把锁一样~而ReleaseMutex 就是一把钥匙

当10个人都看到这个门的时候,第一个到达门口的人会看到屋子里没有人,则他进去,同时会把门锁上~

后面的人自然要在门口等候,当此人在屋子里执行完任务后他会用钥匙把门打开!

出去后把锁交给门口排队的第二位同志,第二位同志再做同样的操作

如果第一位同志执行完任务以后不把使用权交给第二个人的话,而直接退出

那么屋子自然就空了下来,而门还是锁的~不必担心~门会自动打开,只要是前一个人已经不在屋子里即可~

然后再来说说这个Interlocked,官方说明是”对一个变量进行原子操作进行递增或者递减然后保存”

原子操作的概念就是,有且只有一个线程在对此变量进行操作~不准其他线程干预的操作

当对一个变量进行原子操作的时候,此变量就会加锁,而其他线程是无法访问的,只能挂起等候此变量解锁

我感觉实际上使用的也就是Mutex来实现的

好了开始说说具体的实现吧

public class MutexTest
{

private static int poolFlag = 0 ;//标记
private const int amountThread = 10 ;//线程总量
private const int maxThread = 3 ;//可执行线程最大数量
private static Mutex muxConsole = new Mutex() ;

public static void Main()
{

for ( int i = 0 ; i < amountThread ; i ++ )
{

// 创建指定数量的线程
// 是线程调用Run方法
// 启动线程
Thread trd = new Thread( new ThreadStart( Run ) ) ;
trd.Name = “线程” + i ;
trd.Start() ;
}
}

public static void Run()
{

muxConsole.WaitOne(); //阻塞队列
Interlocked.Increment(ref poolFlag) ; //标记+1
if (poolFlag != maxThread) //判断是否等于上限
muxConsole.ReleaseMutex(); //如果此线程达不到可执行线程上限,则继续开通,让后面的线程进来
Console.WriteLine( “{0} 正在运行……\n”, Thread.CurrentThread.Name ) ;
Thread.Sleep( 5000 ); //模拟执行
Console.WriteLine( “{0} 已经中止……\n”, Thread.CurrentThread.Name ) ;

//标记-1
Interlocked.Decrement(ref poolFlag) ;
}
}

 

另外一种,放在 WaitForSingleObject后面 直到不再需要保护参数为止 如 要保护全局 int a; 线程1 { WaitforsingleObject....... //等待获得对a的写的权利 a++ //保护部分 ReleaseMutex...... //不需要保护了 允许其它线程写a } 线程2 { WaitforsingleObject....... //等待获得对a的写的权利 a++ //保护部分 ReleaseMutex...... //不需要保护了 允许其它线程写a }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153164.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • request.getParameterNames_request和urllib区别

    request.getParameterNames_request和urllib区别Servlet中request.getParameter和getParameterValues getParameterNames三者区别1.request.getParameter:获取前台表单单个元素name对应的value值2.request.getParameterValues:获取前台表单多个标签同名name对应的所有value值3.request.getParameterN…

    2022年9月4日
  • Qt小软件:LanFileSender(局域网文件传输小工具)

    Qt小软件:LanFileSender(局域网文件传输小工具)最近写了一个局域网文件传输小工具,自己用了一段时间了,觉得也稳定了,发出来分享一下。开启后会自动搜索局域网内的主机,然后直接发送文件就可以了。可以设置昵称和存储目录(默认在下载文件夹下)截图:功能详解:File:添加文件Director:添加文件夹Clear:清空文件列表Send:发送文件Ping:发送ping(不是CMD的那个p

    2022年6月3日
  • client的中文意思是什么_java中cin什么意思

    client的中文意思是什么_java中cin什么意思IE中: document.body.clientWidth==>BODY对象宽度 document.body.clientHeight==>BODY对象高度 document.documentElement.clientWidth==>可见区域宽度 document.documentElement.clientHeight==>可见区域高度 FireFox中:

    2022年9月11日
  • armv7在哪儿看(armv7s)

    iOS中的armv7,armv7s,arm64,i386,x86_64都是什么在做静态库的时候以及引用静态库的时候经常会遇到一些关于真机模拟器不通用的情况,会报错找不到相应库导致编译失败,这里简单记录一下各种设备支持的架构。iOS测试分为模拟器测试和真机测试,处理器分为32位处理器,和64位处理器,模拟器32位处理器测试需要i386架构,(iphone5,iphone5s以下的模拟器…

    2022年4月11日
  • mysql字符串拼接的方法_sql中拼接字符串的方法

    mysql字符串拼接的方法_sql中拼接字符串的方法总是记不住字符串拼接,每次都要百度去搜索,所以在这里记录一下,好方便后续的查找,如有错误和问题可以提出,谢谢。字符串拼接分为几种方式,在这里会一一举例写出:第一种:mysql自带语法CONCAT(string1,string2,…),此处是直接把string1和string2等等的字符串拼接起来(无缝拼接哦)说明:此方法在拼接的时候如果有一个值为NULL,则返回NULL…

    2022年9月30日
  • shell脚本之awk数组

    shell脚本之awk数组一.数组格式数组是一个包含一系列元素的表.格式如下:abc[1]=”xiaohong”abc[2]=”xiaolan”解释:abc:为数组名称[1]、[2]:为数组元素下标,可以理解为数组的第1个元素、数组的第2个元素xiaohong、xiaolan:元素值例子1:定义数组,并且打印数组元素[root@tab0~]#awk’BEGIN{a[0]=”xiaohong”;a[1]=”xiaolan”;printa[0]}’xiaohong[root@tab0~]#awk

    2022年7月19日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号