最好自己手动敲下代码,对理解有很大帮助。
来源:互联网 发布:软件开发基础培训 编辑:程序博客网 时间:2024/05/16 12:22
最好自己手动敲下代码,对理解有很大帮助。
摘要
又不知是哪位前辈高人所写:在WC里占蹲位的3种方法:
1、如果你只对某个蹲位情有独钟,就要WaitOne(),但是不要忘了ReleaseMutex(),千万别WaitOne()两次只ReleaseMutex()一次(你干这种占着MK不LS的事,憋坏了后来的小朋友怎么办?就算没有小朋友,憋坏了小猫小狗也不好啊……);
2、如果你喜欢讲排场,需要占2个蹲位才肯办事,则要WaitAll([蹲位1, 蹲位2]);
3、如果你觉得随便去哪个蹲位办事都无所谓,那就可以WaitAny([蹲位1, 蹲位2])……。
Mutex的WaitOne()函数
前几天1-2-3去黑木崖找东方不败玩,听到东方不败抱怨说整天绣花眼睛好累呀,于是1-2-3就给东方不败编了一个活动眼睛的程序。
class Program{ static void Main(string[] args) { // 为截图方便把窗体设小一点 Console.WindowWidth = 30; Console.BufferWidth = 30; Console.WindowHeight = 16; Console.BufferHeight = 16; Mutex mk = new Mutex(false, "my mutex"); for (int i = 0; i < 1000; i++) { mk.WaitOne(); for (int j = 0; j < 30; j++) { Console.Write(">"); Thread.Sleep(100); } mk.ReleaseMutex(); Thread.Sleep(500); } }}
接连运行此程序的两个实例(运行一个控制台应用程序后再点运行,即表示开启两个进程),把它们并排排放在一起(如下图所示),即可看到箭头从左边的窗体“穿越”到右边窗体的效果了。
是的,我们需要同步两个进程(中的主线程),这个工作需要交给Mutex。Mutex和Monitor的概念十分相似,只不过Monitor是.net内建的线程同步机制,Mutex是封装了Windows操作系统的线程同步机制;Monitor速度快,Mutex的速度要比Monitor慢很多;Monitor只能用于同步同一进程内的线程;Mutex则可以用于同步隶属于不同进程的线程。
Mutex的WaitAll()函数
现在我们对WC进行了扩建,把mk增加到两个,可是却遇到了两个讲排场的进程,它们都要同时占两个mk才肯办事,所以运行起来的效果和前一个程序一样。
class Program{ static void Main(string[] args) { // 为截图方便把窗体设小一点 Console.WindowWidth = 30; Console.BufferWidth = 30; Console.WindowHeight = 16; Console.BufferHeight = 16; Mutex mk1 = new Mutex(false, "my mutex1"); Mutex mk2 = new Mutex(false, "my mutex2"); Mutex[] mks = new Mutex[] { mk1, mk2 }; for (int i = 0; i < 1000; i++) { Mutex.WaitAll(mks); for (int j = 0; j < 30; j++) { Console.Write(">"); Thread.Sleep(100); } mk1.ReleaseMutex(); mk2.ReleaseMutex(); Thread.Sleep(500); } }}
Mutex的WaitAny()函数
看下这个小程序:
class Program { static void Main(string[] args) { // 为截图方便把窗体设小一点 Console.WindowWidth = 30; Console.BufferWidth = 30; Console.WindowHeight = 16; Console.BufferHeight = 16; Mutex mk1 = new Mutex(false, "my mutex1"); Mutex mk2 = new Mutex(false, "my mutex2"); Mutex[] mks = new Mutex[] { mk1, mk2 }; for (int i = 0; i < 1000; i++) { int index = Mutex.WaitAny(mks); // 返回值为此进程占用的mk在mks里的index Console.Write("Index: " + index.ToString()); for (int j = 0; j < 30; j++) { Console.Write(">"); Thread.Sleep(100); } mks[index].ReleaseMutex(); Thread.Sleep(new Random().Next(100, 3000)); } }}
如果同时运行此程序的两个实例,正如本文摘要里所写的,只要mk1和mk2有一个是空闲的,进程就可以进去办事,所以两个进程可以同时输出">"字符。注意程序的第24行,每个进程在输出30个">"字符后都会随机Sleep 100到3000毫秒,这样就有可能出现mk1和mk2同时空闲的情况,所以就会出现一会儿进程1占用mk1而进程2占用mk2;一会儿进程1占用mk2而进程2占用mk1的情况(在下图分别用绿色和红色波浪线标出)。
参考:http://www.cnblogs.com/1-2-3/articles/1212391.html
- 最好自己手动敲下代码,对理解有很大帮助。
- 直立车调试指南,自己写的,我觉得对初学者还是有很大帮助的。。
- 哈哈,看看吧!对自己有帮助
- IOS常用第三方库,自己mark下,希望对其他人有帮助
- 改善机箱空气对流对ATI 4890 显卡过热问题有很大帮助
- Eclipse使用技巧,花一点时间看一下,对你的编程有很大的帮助。
- C标准中的一些预定义宏对调试程序有很大帮助
- 学习计算机知识,对以后会有很大的帮助的
- 觉得对我这种随便起变量名的人有很大帮助的一篇文章
- 必看的应用有很大帮助
- 对我帮助很大的网站
- 在老大的帮助下我对于程序和服务器配置相关知识有很大了解
- 自己整理的Transact_SQL,也许对你有帮助
- 从好友收罗来的,希望对自己有帮助。
- 记录一些对自己有帮助的博客
- 如何帮助自己做最好的自己?
- ThinkPHP删除指定文件(物理删除) 点击链接可查看详情(对学习可有很大的帮助的
- 对理解 model1 model2 请求和相应及 JSP + Servlet 响应工作,有很大点睛作用
- 黑马程序员<梦想之旅>正则表达式
- 在ump系统的那半个多月-jqGrid
- Android--SoftReference缓存图片
- CATransform3D 矩阵变换之立方体旋转实现细节
- 老码农教你学英语:补充一些英语学习素材
- 最好自己手动敲下代码,对理解有很大帮助。
- ora-00054:resource busy and acquire with nowait specified解决方法
- JavaEE6-异步Servlet Sample
- More Effective C++:理解new和delete
- Android TextProgressBar
- Berkeley DB 的简介
- POJ1000
- MySQL分区表
- Nginx配置文件详细说明