标签:style class blog code tar ext
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.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
public class SynchronizationClass : ContextBoundObject { ... }
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);
标签:style class blog code tar ext
原文地址:http://www.cnblogs.com/leihdm/p/3794956.html