Monitor线程同步
最近在园子里看到有关monitor实现线程同步的文章,正好最近的项目中要用到并发控制,所以就抽时间学习了一下monitor,之前都是不怎么写博客的,呵呵感觉花了时间去学习它,还是记下来比较好。。monitor我理解为是一个监视器,用来监视临界区域的信号量。学过操作系统的童鞋都应该知道这个概念哈~因为要通过信号量,所以要定义一个信号量,这里我们通常定义一个object类型的变量,注意这个变量一定要是一个公共的,并且是全局的,千万不能定义在临界区内~~~
class MonitorTest { MyServer.MyServerClient wcf = new MyServer.MyServerClient(); IMyServer ichan = null; ChannelFactory<IMyServer> cha = new ChannelFactory<IMyServer>("BasicHttpBinding_IMyServer");object monitor = new object();public static int iCount = 0;public MonitorTest() { cha.Open(); ichan = cha.CreateChannel(); wcf.CalculateCompleted += new EventHandler<MyServer.CalculateCompletedEventArgs>(wcf_CalculateCompleted); } void wcf_CalculateCompleted(object sender, MyServer.CalculateCompletedEventArgs e) { Console.WriteLine("我是线程{0} "+"iCount的值为{1}",Thread.CurrentThread.Name,e.Result.ToString()); } public void Test() { Thread t1 = new Thread(Test1); t1.Name = "t1"; Thread t2 = new Thread(Test2); t2.Name = "t2"; t1.Start(); t2.Start(); }public void Test1() { for (int i = 0; i < 10; i++) { iCount++; Console.WriteLine("我是线程{0} " + "iCount的值为{1}", Thread.CurrentThread.Name, iCount); } }public void Test2() {for (int i = 0; i < 10; i++) { iCount--; Console.WriteLine("我是线程{0} " + "iCount的值为{1}", Thread.CurrentThread.Name, iCount); } } }
本来想通过控制台项目添加wcf引用的,可是不知道为什么在调用服务了,没有任何反应,用fiddler工具也没有检测到任何的信息,所以,无奈之下,只好调用本地的方法,以后再研究研究。上面是没有加锁控制的,可以看到结果很混乱,谁抢到了谁就用。。显然不行。
下面是加锁之后的效果:
class MonitorTest { MyServer.MyServerClient wcf = new MyServer.MyServerClient(); IMyServer ichan = null; ChannelFactory<IMyServer> cha = new ChannelFactory<IMyServer>("BasicHttpBinding_IMyServer");object monitor = new object();public static int iCount = 0;public MonitorTest() { cha.Open(); ichan = cha.CreateChannel(); wcf.CalculateCompleted += new EventHandler<MyServer.CalculateCompletedEventArgs>(wcf_CalculateCompleted); } void wcf_CalculateCompleted(object sender, MyServer.CalculateCompletedEventArgs e) { Console.WriteLine("我是线程{0} "+"iCount的值为{1}",Thread.CurrentThread.Name,e.Result.ToString()); } public void Test() { Thread t1 = new Thread(Test1); t1.Name = "t1"; Thread t2 = new Thread(Test2); t2.Name = "t2"; t1.Start(); t2.Start(); }public void Test1() { lock (monitor) { Monitor.Pulse(monitor);for (int i = 0; i < 10; i++) { iCount++; Console.WriteLine("我是线程{0} " + "iCount的值为{1}", Thread.CurrentThread.Name, iCount); } Monitor.Wait(monitor); } }public void Test2() {lock (monitor) { Monitor.Pulse(monitor);for (int i = 0; i < 10; i++) { iCount--; Console.WriteLine("我是线程{0} " + "iCount的值为{1}", Thread.CurrentThread.Name, iCount); } Monitor.Wait(monitor); } } }
转载于:https://www.cnblogs.com/zylEnjoyIT/archive/2012/03/20/2408825.html
Monitor线程同步相关推荐
- 线程同步 – lock和Monitor
在多线程代码中,多个线程可能会访问一些公共的资源(变量.方法逻辑等等),这些公共资源称为临界区(共享区):临界区的资源是不安全,所以需要通过线程同步对多个访问临界区的线程进行控制. 同样,有些时候我们 ...
- 转:C# 线程同步技术 Monitor 和Lock
原文地址:http://www.cnblogs.com/lxblog/archive/2013/03/07/2947182.html 今天我们总结一下 C#线程同步 中的 Monitor 类 和 Lo ...
- 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)
多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上) 转自 http://www.cnblogs.com/freshman0216/archive/2008/07/27/ ...
- 改善C#程序的建议6:在线程同步中使用信号量
所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定.C#中对象的类型分为引用类型和值类型.CLR在这两种类型上的等待是不一样的.我们可以简单的理解为在CL ...
- C#线程同步的几种方法
在网上也看过一些关于线程同步的文章,其实线程同步有好几种方法,下面我就简单的做一下归纳. 一.volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的.它只能在变量一级做 ...
- Java高级-线程同步机制实现
2019独角兽企业重金招聘Python工程师标准>>> 前言 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Threa ...
- C#中的线程(二) 线程同步基础
1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...
- java线程 同步与异步 线程池
1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有时为了解 决此问题,优先考虑 ...
- Java线程(二):线程同步synchronized和volatile
上篇通 过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么 会产生这样的结果呢,因为建立的Count对象是 ...
- Java核心(三)并发中的线程同步与锁
2019独角兽企业重金招聘Python工程师标准>>> 乐观锁.悲观锁.公平锁.自旋锁.偏向锁.轻量级锁.重量级锁.锁膨胀...难理解?不存的!来,话不多说,带你飙车. 上一篇介绍了 ...
最新文章
- 2021届图像/计算机视觉算法提前批的面经 | 附内推码
- python实现简单的api接口-Python实现简单的API接口
- 仿联想商城laravel实战---7、lavarel中如何给用户发送邮件
- 总结这阵子的FPGA工作
- Python ValueError: IO operation on closed file
- Netty(二)(入门篇)传统的Bio编程
- linux内存管理(十)-页表管理
- 在Microsoft-IIS/10.0上面部署mvc站点的时候,出现404的错误
- 《麦肯锡方法》读书笔记10
- 开心网之开心餐厅游戏分析报告
- 基于51单片机的智能温控风扇(程序+仿真+原理图)
- pc炉石传说显示无法联觉服务器,《炉石传说》酒馆战棋尤朵拉船长怎么玩 尤朵拉船长运营思路一览...
- HbuilderX 自有证书生成
- 学习Java的你知道什么是程序思维?
- 编码字符串,使得总长度最短
- 计算机网络—数据链路层
- 【R语言】ggplot2---散点图的边框和颜色填充问题
- 关于对《三只松鼠》网站的诊断报告
- u盘无法识别怎么办?看完不愁数据恢复
- 百度SEO和谷歌SEO有什么区别?
热门文章
- TDengine:A股分钟线数据的尝试
- 一些python书=待买
- Rust: codewars的prize draw算法
- 全面Severless化只需7天!看南瓜电影的云上极速升级
- 凝结11年技术实力 弹性计算国内首著发布
- php curl curloptcookiesession,curlopt_cookie问题
- 【水果识别】基于matlab GUI橙子数量识别【含Matlab源码 1821期】
- 【优化算法】先导粘菌算法(LSMA)【含Matlab源码 1436期】
- 【路径规划】基于matlab A_star算法机器人动态避障路径规划【含Matlab源码 1033期】
- 【跳频通信】基于matlab跳频通信系统仿真【含Matlab源码 967期】