2013-06-04 2 views
2

내가 이렇게 스레드를 만들려고하고있다 : 그것은 ReadKey() 방법 후 시작됩니다스레드 생성 및 시작

static void Main(string[] args) 
{    

    Thread tr2 = new Thread(() => 
    { 
     int a = 0; 

     Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId); 
    }); 


    tr2.Start(); 

    Console.ReadKey(); 
} 

그러나 tr2이 시작되지 않습니다, 나는 Main 방법이 첫 번째 라인을 추가 할 때, ReadKey() 방법 전에 tr2 시작 :

static void Main(string[] args) 
{ 
    Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId); 



    Thread tr2 = new Thread(() => 
    { 
     int a = 0; 

     Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId); 
    }); 



    tr2.Start(); 

    Console.ReadKey(); 
} 

잘못인가?

+0

왜 두 번째 코드에서 주 스레드가 항상 승자입니까? –

+0

이것은 동기화 문제이며 많은 HW/SW 런타임 매개 변수에 따라 달라집니다. 항상 그런 것은 아닙니다 ... 어쨌든 무엇을 묻고 싶습니까? –

+0

OK : stackoverflow.com/a/15144672/328194 –

답변

2

Console.ReadKey()Console.InternalSyncObject이라는 콘솔 클래스의 내부 개체에 대한 잠금을 가져옵니다.

간단히 말해서 실행하기 전에 Console.WriteLine이 잠금 해제를 기다리고 있다는 것을 의미합니다. 그리고 짐작할 수 있듯이 키를 누를 때마다 잠금이 해제됩니다.

+1

좋은 설명은 여기에 있습니다 : http : // stackoverflow.com/a/15144672/328194 – trydis

+0

내가 생각하기에 : WriteLine()을 추가하면 CPU가 읽기 키를 실행하지 않고 승자가 tr2 인 단일 명령이 있습니다. –

+0

@trydis, touché .. 스티븐은 나보다 훨씬 더 나은 설명을 해준다. – ebb

1

어디가 잘못 되었습니까?

아무 문제가 없습니다. 이 동작은 실수로 발생한 것입니다. 다른 수의 CPU 코어를 사용하는 다른 컴퓨터에서 프로그램을 실행하면 결과가 다를 수 있습니다. 당신은 모든 컴퓨터에 어떤 특별한 행동을 기대한다면, 당신은 스레드

+0

tr2가 주 스레드보다 먼저 시작된다고 말하지 마라. 아마 메인이 void가 아니라는 것을 의미 할 것이다. 메인 스레드 .. 네? –

+0

물론 tr2가 main보다 tr2를 시작하기 때문에 tr2가 시작되지는 않지만 비동기 적으로 시작되므로 한 코어/한 CPU 머신에서 quasiparallel을 실행하거나 다른 – VladL

2

http://msdn.microsoft.com/en-us/library/471w8d85.aspx

ReadKey 방법 대기를 동기화해야한다, 즉, 문자 또는 기능까지 ReadKey 방법을 발급 스레드 블록, 키를 누릅니다. 문자 또는 기능 키를 하나 또는 개 이상의 Alt, Ctrl 또는 Shift 수정 키와 함께 누르면 누를 수 있습니다. 그러나 한정자 키를 단독으로 눌러도 ReadKey 메서드가 반환되지 않습니다.

나는 ReadKey 블록 Console의 실행이 줄에 중단 점을 추가하려고 생각 :

int a = 0;

스레드 시작해야하며 휴식을 것이다.

문제는 다음과 같습니다. 주 스레드가 이벤트를 기다리는 Console.ReadKey 실행 중이고 두 번째 스레드가 같은 콘솔에 줄을 쓰려고합니다. 호환성이 없으며 결과는 컴퓨터에 따라 다릅니다.

+0

에서 실제로 병렬로 실행됩니다. 그래서 내가 WriteLine()을 추가하면 CPU가 읽기 키를 실행하지 않도록하는 단일 명령어가 있습니다 ... –