2009-03-19 7 views
0

코드가 스레딩 될 때 nunit이 제대로 작동하지 않는 것 같아요 :스레딩이 Nunit에서 제대로 작동하지 않습니까?

여기 샘플 코드가 있습니다 :

public class multiply 
{ 
    public Thread myThread; 
    public int Counter 
    { 
     get; 
     private set; 
    } 
    public string name 
    { 
     get; 
     private set; 
    } 
    private Object thisLock = new Object(); 
    public void RunConsolePrint() 
    { 
     //lock(thisLock) 
     //{ 
     Console.WriteLine("Now thread " + name + " has started"); 
     for (int i = 1; i<= Counter; i++) 
     { 
      Console.WriteLine(name + ": count has reached " + i+ ": total count is "+Counter); 
     } 
     Console.WriteLine("Thread " + name + " has finished"); 
     //} 
    } 
    public multiply(string pname, int pCounter) 
    { 
     name = pname; 
     Counter = pCounter; 
     myThread = new Thread(new ThreadStart(RunConsolePrint)); 
    } 
} 

그리고 여기 테스트 코드가 있습니다 :

[Test] 
public void Main() 
{ 
    counter=100; 

    multiply m2=new multiply("Second", counter); 
    multiply m1 = new multiply("First", counter); 
    m1.myThread.Start(); 
    m2.myThread.Start(); 

} 

그리고 출력은 다음과 같습니다. m1m2의 순차적 인 실행은 m1의 루프가 임을 의미합니다. 항상m2보다 먼저 실행됩니다. 이는 적어도 테스트 결과입니다. 나는 몇 번 시험을 치렀다. 나는 항상 이것을 얻는다.

이것은 버그입니까? 아니면 예상되는 행동인가?

위의 코드를 콘솔 프로그램에 복사하여 실행하면 스레딩 효과를 명확하게 볼 수 있습니다.

TestDriven.net 러너를 사용하여 테스트를 사용하고 있습니다.

답변

0

m1 또는 m2이 먼저 실행을 시작하는지 여부는 비 결정적입니다. 카운터가 충분히 빠르게 실행되면 다른 시작 전에 그 중 하나가 완료되는 것을보고 놀라지 않을 것입니다. 개수를 매우 큰 (예 : 백만) 것으로 변경하면 별도의 스레드가 동시에 실행되는 것을 확인할 수 있습니다.

결과가 가능합니다. 어떤 결과가 나타나면 버그가 있음을 알 수 있습니까?

+0

위의 테스트를 몇 번 실행하면 일관된 결과가 나타납니다. m2가 항상 m2보다 앞에 먼저 실행됩니다. – Graviton

+2

그렇다고 버그가 있음을 의미하지는 않습니다. 그것은 단지 스케줄링의 단점 일 수 있습니다. 작업을 더 길게 만들어보십시오. –

2

두 개 이상의 스레드의 정확한 인터리빙은 실제로 예측할 수 없습니다.

예를 들어 고려해야 할 몇 가지 요소가 있습니다. 우선, 각 스레드는 (잠재적으로) 다른 스레드로 전환되기 전에 양자에 대해 실행됩니다. 스레드 스위치가 코드의 특정 위치에서 발생할 것으로 기대할 수 없습니다. 나는. 한 스레드는 다른 스레드가 시작되기 전에 완료 될 수 있습니다 (특히 작업이 상대적으로 짧기 때문에).

둘째, 콘솔에 쓰고 있기 때문에 스레드는 해당 액세스에서 동기화됩니다. 이것은 또한 인터리빙에 영향을 미칩니다.

결과는 또한 컴퓨터에서 사용할 수있는 코어 수 (코드를 실행할 때 시스템의 일반로드)에 따라 다릅니다.

요약하면 두 스레드가 어떻게 실행될 지 예측할 수 없습니다.

관련 문제