2009-08-03 2 views
2

객체를 생성하는 콘솔 테스트 응용 프로그램을 만들었습니다. 객체 &은 2 개의 개별 스레드에서 2 개의 함수를 호출합니다. 한 스레드는 숫자 1 - 20을 다른 순서로 역순으로 인쇄합니다.메인 스레드를 디버깅 할 때 작업 스레드가 실행되지 않는 이유는 무엇입니까?

문제점은 주 스레드의 디버깅을 중지하지 않을 때까지 (즉, f5 키를 누를 때까지) 첫 번째 작업자 스레드 디버깅이 시작되지 않는 문제입니다. 어떤 대답? 이 비주얼 스튜디오 또는 CLR의 제한이 있지만, 하나 개의 스레드에 중단 점을 설정하면 모든 스레드가 중지되고,

class Program 
{ 
    static void Main(string[] args) 
    { 
    DisplayData dd = new DisplayData(); 

    ThreadStart ts1 = new ThreadStart(dd.DisplayNumber); 
    Thread t1 = new Thread(ts1); 
    t1.Name = "Display Numbers"; 

    ThreadStart ts2 = new ThreadStart(dd.ReverseNumbers); 
    Thread t2 = new Thread(ts2); 
    t2.Name = "Reverse Numbers"; 

    t1.Start(); //Keep 1st break point at this location. Then press F10. 
    t2.Start(); //Keep break point at this location permanently 
    } 




public class DisplayData 
    { 
     public void DisplayNumber() 
     { 
      int length = 20; 
      Console.WriteLine("\nNumbers in correct order.\n"); 


      for (int i = 0; i < length; i++) 
      { 

      Console.WriteLine("DN: The value of i is: " + (i+1) + " " + Thread.CurrentThread.ManagedThreadId + " " + Thread.CurrentThread.Name); 
      //Thread.Sleep(1000); 

      } 
     } 

     public void ReverseNumbers() 
     { 
      int length = 20; 
      Console.WriteLine("\nNumbers in reverse order.\n"); 
      for (int i = 0; i < length; i++) 
      { 

      Console.WriteLine("RN: The value of i is: " + (length - i) + " " + Thread.CurrentThread.ManagedThreadId + " " + Thread.CurrentThread.Name); 
      //Thread.Sleep(1000); 
      } 
     } 
+0

sDisplayNumber와 ReverseNumbers는 어떻게 생겼습니까? –

+0

한 가지 문제점은 스레드를 시작할 때 t2.Start()로 내려 가면 t1이 아직 시작되지 않았을 수도 있지만 그 행에서 일시 중지 중이므로 아무 일도 일어나지 않을 것이라는 보장이 없다는 것입니다. t1.Start()와 t2.Start() 사이에 줄을 삽입하면 스레드가 시작되었는지 확인한 다음 t2를 시작하면 더 잘 작동합니다. –

+0

t1.Start() & t2.Start (0에서 t1까지) 사이에 Console.ReadKey()를 입력하면 –

답변

6

는 잘 모르겠어요.

스레드를 일시 중지하려는 경우 Debug..Threads 창을 통해이를 수행 할 수 있습니다. 스레드를 일시 중지했다가 다시 시작할 수 있습니다.

+4

개인적으로, 나는 breakpoint를 설정하면 모든 쓰레드가 깨지는 것을 고려하지 않는다. 다중 쓰레드 코드를 디버깅 할 때 , 디버깅 세션에서 단계의 순서가 정확히 무엇인지 알고 싶습니다. –

+0

스레드 창으로 이동 -> 메인 스레드 고정 및 f5 키를 누르면 스레드 t1이 실행되지만 주 스레드를 다시 시작할 방법이 없습니다. 스레드 윈도우가 포커스를 잃었을 때 (브레이크 포인트가 빠져 나오기 때문에 공백이 나온다.) 나는 VBSStudio가 기본적으로 모든 스레드를 멈추게하고, 앤드류는 디버깅 목적으로 좋다고 말했다. . –

+0

이 제한은 좋은 생각입니다. 갑자기 각 스레드의 상황을보고 중단하려는 경우입니다. 어떤 스레드에서든 조건을 깨고 싶다고 가정 해 봅시다. 이제 다른 스레드가 계속 실행 중이면 그 시점에 프로그램의 스냅 샷보기를 어떻게 얻을 수 있습니까?어쨌든, 당신은 당신의 의지에있는 모든 스레드를 얼리거나 해동 할 수 있습니다 (중단 한 번). 자연스러운 디버깅 흐름에 좋습니다. –

2

다른 위협 요소에 대한 작업은 컨텍스트 전환이 발생할 때까지 시작되지 않습니다. CPU가 다른 것을 시작하기로 결정하기 전에 메인 루틴에서 모든 작업을 쉽게 처리 할 수 ​​있습니다.

t1.Join()을 사용하면 작업자 스레드가 완료 될 때까지 기다렸다가 작업을 계속할 수 있습니다.

1

주 스레드 코드를 계속 진행하면 결국 작업자 스레드 중 하나로 전환됩니다. 즉 특별히 디버깅 할 거라면

그러나 상황에서 할 수있는 가장 간단한 것은, DisplayNumber로서 ReverseNumbers의 첫 번째 줄에 중단 점을 배치하는 것입니다.

+0

문제는 스레딩이 작동하는 방식을 이해하려고 시도했기 때문입니다. 그러므로 간단한 예입니다. –

1

"실행"하지만 반드시 시간 조각이 필요하지는 않습니다. 코드를 한 단계 씩 실행하면 모든 스레드가 효과적으로 "실행"됩니다. 그러나 실제 실행중인 스레드 수는 사용 가능한 CPU에 따라 다릅니다. 상황에 따라 다른 스레드가 실행될 수도 있고 실행되지 않을 수도 있습니다.

.NET Framework는 표준 출력에 대한 액세스를 동기화하므로 언제든지 하나의 스레드 만 해당 잠금을 보유하게되므로 다른 스레드가 실행되지 않는다는 인상을 줄 수 있습니다.

+0

다른 가능성. –

관련 문제