技术开发 频道

谈谈多线程的思维方式

  【IT168 技术文档】前段时间仔细看过些关于多线程方面的资料,项目中用到线程的地方也不少,可是,当看了Jeffrey的一篇关于锁的文章后,发现自己虽然一直都在使用多线程,但是缺少了做多线程编程需要的思维!所以想从Jeffrey的Optex(锁)入手,来谈谈我从其中体会的东西。

  在.NET中,我们用的最多的锁机制就是lock,用起来很简单,短短几行程序就可以实现,例如:

Lock 's Code
public class TestThreading
{
    
private System.Object lockThis = new System.Object();
    
public void Function()
    {
        
lock (lockThis)
        {
            
// Access thread-sensitive resources.
        }
    }
}

  其实我们也明白,lock并不是锁,而是MS提供的一个简便式的写法,真正实现的是Monitor类中的Enter和Exit方法,既然提到了Monitor类也就说下有个需要注意的地方:
   
  Pulse和PulseAll方法,这两个方法就是把锁状态将要改变的消息通知给等待队列中的线程,不过这时如果等待队列中没有线程,那么该方法就会一直等待下去,直到有等待的线程进入队列,也就是说该方法可能造成类试死锁的情况出现。
 
  上面的lock + 线程(Thread和ThreadPool) = 多线程编程(N%)!?
   
  对于该公式我曾经的N是80,现在是20。其中有很多东西影响我,让我从80->20,下面的Optex就是一个入口点。

Optex 's Code
public sealed class Optex : IDisposable {
  
private Int32 m_Waiters = 0;
  
private Semaphore m_WaiterLock = new Semaphore(0, Int32.MaxValue);

  
public Optex() { }
  
public void Dispose() {
      
if (m_WaiterLock != null)
      {
         m_WaiterLock.Close();
         m_WaiterLock
= null;
      }
   }

  
public void Enter() {
      Thread.BeginCriticalRegion();
      
// Add ourself to the set of threads interested in the Optex
      if (Interlocked.Increment(ref m_Waiters) == 1) {
        
// If we were the first thread to show interest, we got it.
         return;
      }

      
// Another thread has the Optex, we need to wait for it
      m_WaiterLock.WaitOne();
      
// When WaitOne returns, this thread now has the Optex
   }

  
public void Exit() {
      
// Subtract ourself from the set of threads interested in the Optex
      if (Interlocked.Decrement(ref m_Waiters) > 0) {
        
// Other threads are waiting, wake 1 of them
         m_WaiterLock.Release(1);
      }
      Thread.EndCriticalRegion();
   }
}
0
相关文章