关于线程-lock

对于同一资源的访问,使用lock简洁得现实同步

lock本身的实现:

 [MSDN]

System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
try
{
    DoSomething();
}
finally
{
    System.Threading.Monitor.Exit(obj);
}

使用 lock 关键字通常比直接使用 Monitor 类更可取,一方面是因为 lock 更简洁,另一方面是因为 lock 确保了即使受保护的代码引发异常,也可以释放基础监视器。这是通过 finally 关键字来实现的,无论是否引发异常它都执行关联的代码块。

对于一个线程向另一个线程做事件传达,即同步事件:有两种:AutoResetEvent 和 ManualResetEvent

调用等待,如 WaitOne、WaitAny 或 WaitAll

如下例:

using System;
using System.Threading;

class ThreadingExample
{
    static AutoResetEvent autoEvent;

    static void DoWork()
    {
        Console.WriteLine("   worker thread started, now waiting on event...");
        autoEvent.WaitOne();
        Console.WriteLine("   worker thread reactivated, now exiting...");
    }

    static void Main()
    {
        autoEvent = new AutoResetEvent(false);

        Console.WriteLine("main thread starting worker thread...");
        Thread t = new Thread(DoWork);
        t.Start();

        Console.WriteLine("main thrad sleeping for 1 second...");
        Thread.Sleep(1000);

        Console.WriteLine("main thread signaling worker thread...");
        autoEvent.Set();
    }
}
使用Interlocked为多个线程共享的变量提供原子操作
0 == Interlocked.Exchange(ref usingResource, 1)

posted @ 2011-05-25 23:00  CoderBin  阅读(229)  评论(0编辑  收藏  举报