首页 > 学院 > 开发设计 > 正文

Mutex,Monitor,lock,MethodImplAttribute,SynchronizedAttribute的用法差异

2019-11-14 16:13:40
字体:
来源:转载
供稿:网友

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("=======");        }    }}

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表