2011-07-04 4 views
0

아래 코드를 작성했지만 때때로 Debug.Assert raise가 실패합니다. Debug.Assert 문이 때때로 실패하고이를 해결할 수있는 이유는 무엇입니까?Debug.Assert 문이 때때로 실패하는 이유는 무엇입니까?

public class Warehouse 
{ 
    private int stockCount = 0; 

    public void DecrementStock() 
    { 
     if (stockCount > 0) 
     stockCount--; 

     Debug.Assert (stockCount >= 0) 
    } 

    public void IncrementStock() 
    { 
     stockCount ++; 
    } 
} 
+0

가끔은 ...? 언제? – BoltClock

+0

이 서비스를 사용하여 개수를 늘리거나 줄이고 외부 서비스로 전화를 겁니다. 보통 잘 작동하지만 때로는 실패합니다. – Peyman

+0

'Debug' 클래스 메소드는 실행중인 어셈블리가 "디버그"모드로 빌드 된 경우에만 작동합니다. 디버그 모드로 실행하지 않을 때 코드가 "실패"합니까? –

답변

4

이것은 실제로 멀티 스레딩 문제와 같은 냄새가납니다. lockstockCount 회원에 대한 액세스 권한을 부여하는 것이 좋습니다.

public class Warehouse 
{ 
    private int stockCount = 0; 
    private object stockSynch = new object(); 

    public void DecrementStock() 
    { 
     lock(stockSynch) 
     { 
      if (stockCount > 0) 
      stockCount--; 

      Debug.Assert (stockCount >= 0) 
     } 
    } 

    public void IncrementStock() 
    { 
     lock(stockSynch) 
     { 
      stockCount ++; 
     } 
    } 
} 
4

DecrementStock가 호출 될 때 stockCount-1 말한다. if 조건으로 인해 stockCount--이 건너 뛴 다음 stockCount은 여전히 ​​-1이고 트리거는 Debug.Assert이됩니다.

이는 값이

또는

  • DecrementStock이 넘치는 것을 다음 중 하나

    • IncrementStock가 호출 너무 여러 번 stockCount 접촉하는 유일한 기능, 있어야하는 경우 동기화없이 여러 스레드에서 호출 됨

    귀하의 의견을 바탕으로, 나는 여러 스레드에서 비동기 액세스가 실제로 문제라고 생각합니다.

+0

+1 여러 스레드가 동기화되지 않는 것으로 의심됩니다. – BrokenGlass

관련 문제