码迷,mamicode.com
首页 > 其他好文 > 详细

C# 同步

时间:2014-06-21 12:06:35      阅读:320      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   code   tar   ext   

  • Interlocked
    simple 

    arithmetic operations are not atomic.Interlocked类提供了一个专门的机制用于完成这些特定的操作。这个类提供了Increment、Decrement、Add静态方法用于对int或long型变量的递增、递减或相加操作

    Interlocked.Increment(ref counter);

     

  • AutoResetEvent
    One simple, and thread-safe way to force a thread to wait until another is completed is to use the AutoResetEvent class
    Wait将阻塞线程

  • AutoResetEvent waitHandle = new AutoResetEvent(false);
    
    Thread t = new Thread(...);
    t.Start();
    
    // Wait (with timeout) here until you are notified!
    waitHandle.WaitOne(2000);
    Console.WriteLine("Other thread is done!");
    // in thread t // Tell other thread we are done. waitHandle.Set();

    同步事件有两种:AutoResetEvent和 ManualResetEvent。它们之间唯一不同的地方就是在激活线程之后,状态是否自动由终止变为非终止。AutoResetEvent自动变为 no-signal. AutoResetEvent只能激活一个线程。而ManualResetEvent要等到它的Reset方法被调用,状态才变为no-signal,在这之前,ManualResetEvent可以激活任意多个线程。

  • C# lock Keyword
    This keyword allows you to define a scope of statements that must be synchronized between thread
    MSDN:最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。

  • // Lock token.
    private object threadLock = new object();
    
    // Use the private object lock token.
    lock (threadLock)
    { ... 
    // All code within this scope is thread safe.
    }

     

  • Monitor
    the lock keyword is equals to
  • Monitor.Enter(threadLock, ref lockTaken);
    try
    { ... }
    finally
    {
      if (lockTaken) Monitor.Exit(threadLock);
    }

    让当前线程在等待1000秒后根据返回的bool值来决定是否继续下面的操作

    bool gotLock = Monitor.TryEnter(threadLock,1000

    Monitor.Pulse/wait:

               |- 拥有锁的线程
    lockObj -> |- 就绪队列(ready queue)
               |- 等待队列(wait queue)

    User Wait to go to the wait queue, use Pulse/PulseAll to push (all) from wait queue to ready queue 

 

  • [Synchronization] Attribute
    In essence, this class-level attribute effectively locks down all instance member code of the object for thread safety.
    public class SynchronizationClass : ContextBoundObject 
    { ... }
  •  [MethodImpl(MethodImplOptions.Synchronized)] 
    如果临界区是跨越整个方法的,也就是说,整个方法内部的代码都需要上锁的话,使用MethodImplAttribute属性会更简单一些.

  • ReaderWriterLock
    C#提供了System.Threading.ReaderWriterLock类以适应多用户读/单用户写的场景。
    private static ReaderWriterLock m_readerWriterLock = new ReaderWriterLock();
    
    m_readerWriterLock.AcquireReaderLock(10000);
     ... 
    m_readerWriterLock.ReleaseReaderLock();
    
    m_readerWriterLock.AcquireWriterLock(1000);
    ...
    m_readerWriterLock.ReleaseWriterLock();

    m_readerWriterLock.UpgradeToWriterLock(1000);

 

C# 同步,布布扣,bubuko.com

C# 同步

标签:style   class   blog   code   tar   ext   

原文地址:http://www.cnblogs.com/leihdm/p/3794956.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!