Mutex,Monitor,lock,MethodImplAttribute,Synchr…
2018-06-18 02:58:21来源:未知 阅读 ()
1)Mutex:进程之间的同步(互斥量)。
2)lock/Monitor……:线程同步。其中lock是Monitor的简化版本(直接生成try{Monitor.Enter(……)}finally{Monitor.Exit(……);}方法。
当然,Monitor还有Pulse方法,该方法对于锁定同一个对象的时候,允许其它线程进入准备区,同时配合Wait方法(Wait将自己暂时退出)。某种情况下可以代替信号量(ManualResetEvent),考察以下例子(来源:http://bbs.csdn.net/topics/380095508):
class MyManualEvent { private object lockObj = new object(); private bool hasSet = false; public void Set() { lock (lockObj) //排队准备领到开锁的钥匙 { hasSet = true; Monitor.PulseAll(lockObj); //通知其他排队人先拿钥匙开锁 } } public void WaitOne() { lock (lockObj) //排队准备领取开锁的钥匙 { while (!hasSet) { Monitor.Wait(lockObj); //等通知,这样可以拿到钥匙开锁了 } } } } class Program { static MyManualEvent myManualEvent = new MyManualEvent(); static void Main(string[] args) { ThreadPool.QueueUserWorkItem(WorkerThread, "A"); ThreadPool.QueueUserWorkItem(WorkerThread, "B"); Console.WriteLine("Press enter to signal the green light"); Console.ReadLine(); myManualEvent.Set(); ThreadPool.QueueUserWorkItem(WorkerThread, "C"); Console.ReadLine(); } static void WorkerThread(object state) { myManualEvent.WaitOne(); Console.WriteLine("Thread {0} got the green light...", state); } }
3)MethodImpl:是一个特性,在System.Runtime.CompilerServices下,等同于lock。在作用于一个类方法的时候=lock(this),作用于一个静态方法等同于lock(typeof(某个类))。
4)SynchronizedAttribute(在System.Runtime.Remoting.Contexts命名空间下)。用于多个程序域实例化某个类,使得该类的数据和方法都可以被同步(单个程序域也可以)。
值得注意的是:WaitHandler的WaitOne方法第二个参数在这里起作用。
示例代码:
namespace ConsoleApplication1 { [Synchronization(true)] class My:ContextBoundObject { static void Main(string[] args) { My my = new My(); ThreadPool.QueueUserWorkItem(my.FuncA); ThreadPool.QueueUserWorkItem(my.FuncA); Console.ReadLine(); } AutoResetEvent myEvent = new AutoResetEvent(false); public void FuncA(object state) { Console.WriteLine("Thread id is:"+Thread.CurrentThread.ManagedThreadId); myEvent.WaitOne(2000, false); //改成true你发现会有第二个线程突然插入并执行 Console.WriteLine("======="); } } }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Task的一些用法总结
下一篇:MVC学习二:基础语法
- Code::Blocks20.03 编译报错 2020-04-17
- C++ Clock函数调用及用途 2019-10-18
- RWMutex:共享/专有的递归互斥锁 2019-10-12
- 体验Code::Blocks下的Windows GUI编程(32 bit and 64 bit) 2019-10-08
- 利用Code::Blocks搭建64位C++开发平台 2019-10-08
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash