我去面试一个C#工作的时候,碰到这么个问题:以下是一个类的定义:
public class StockRoom
{
     private  int stockLevel = 0;public void DecrementStockLevel()
{
     if ( stockLevel > 0 )
          stockLevel --;
     
     Debug.Assert ( stockLevel >= 0 )
}public void IncrementStockLevel()
{
         stockLevel ++;
}
}在多线程并发运行的环境中,Debug.Assert在这里有时候会报错,请问如何纠正。我的回答是:
public class StockRoom
{
     private  int stockLevel = 0;public void DecrementStockLevel()
{
   try {
     lock(this) {
        if ( stockLevel > 0 )
          stockLevel --;
        Thread.Sleep(1);
     }
     Debug.Assert ( stockLevel >= 0 );
}public void IncrementStockLevel()
{
         stockLevel ++;
}
}
这样的回答对吗?我应该怎么回答这样的问题呢?

解决方案 »

  1.   

    打字时漏掉了try 的catch block...应为:
    try {
         lock(this) {
            if ( stockLevel > 0 )
              stockLevel --;
            Thread.Sleep(1);
         }
    } catch {
      ......  //Code来处理异常
    }
      

  2.   

    我觉得这道题是让你考虑互斥问题,因此只要把
    if ( stockLevel > 0 )
    stockLevel --;
    这段代码进行互斥即可,而后面一句则不用加try-catch。例如:
    private static Mutex m = null ;// define as one of class memberspublic void DecrementStockLevel()
    {
    if( m == null ) m = new Mutex();
    m.WaitOne();
    if ( stockLevel > 0 )
    stockLevel --;
    m.ReleaseMutex();Debug.Assert ( stockLevel >= 0 )
    }
      

  3.   

    to 补充一点,两个函数都要互斥不需要的,程序的Debug.Assert ( stockLevel >= 0 ),而第二函数根本不会使它减少,所以第二函数是不需要互斥的。
      

  4.   

    如果不用锁,就这样写
    public void DecrementStockLevel()
    {
    int tmp = stockLevel;
    if ( tmp > 0 )
    tmp --;Debug.Assert ( tmp >= 0 )
    stockLevel = tmp;
    }
      

  5.   

    我自己其实也是想写这个互斥的两个函数。但是又觉得这样的靠Mutex的程序并不真正是线程安全的。而且当时时间紧张,我这个C#菜鸟硬是没想起来Mutex...