2016-06-30 5 views
0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Threading; 

namespace ConsoleApplication58 
{ 
class MultiThreading 
{ 
    static void Main(string[] args) 
    { 
     MultiThreading mul = new MultiThreading(); 

     Thread t1 = new Thread(new ThreadStart(mul.WriteX)); 
     Thread t2 = new Thread(new ThreadStart(mul.WriteO)); 

     t1.Priority = ThreadPriority.Lowest; 
     t2.Priority = ThreadPriority.Highest; 

     t1.Start(); 
     t2.Start(); 

    } 

    private void WriteX() 
    { 
     for (int i = 0; i < 300; i++) 
     { 
      Console.Write("X"); 
     } 
    } 

    private void WriteO() 
    { 
     for (int i = 0; i < 300; i++) 
     { 
      Console.Write("O"); 
     } 
    } 
} 
} 

위의 코드를 실행하면 인쇄 작업이 끝날 것으로 예상됩니다. 그 방법은 최하위 우선 순위를 부여했기 때문에 결국에는 O가 표시되기도합니다. 제 2 스레드 보장에 우선 순위를주지 않는 것이 더 빨리 끝나겠습니까?ThreadPriority를 ​​지원하지 않습니다. ThreadPriority.Lowest 이전에 최우선으로 마무리됩니다.

+1

아마도 코어가 1 개인 CPU가 있지만 현대 컴퓨터에서 발견 된 행운을 빕니다. –

답변

4

우선 순위 설정으로 인한 스레드 예약에 대한 실질적인 보장은 없습니다.

예를 들어 우선 순위가 높은 스레드는 IO 또는 페이지 오류를 차단할 수 있습니다. 그런 다음 다른 스레드가 실행할 수 있습니다.

이것은 스레드를 동기화하는 좋은 방법이 아닙니다.

0

CPU에 대한 300 개의 연산은 초 단위입니다. 문제 및 응용 프로그램을 통계적 실험으로 생각하는 것이 좋습니다.

실험을 여러 번 반복하십시오. 그 중 몇 가지만 실행하면 신뢰할 수 없기 때문에 반복하십시오. 그것은 인구 (iterations의 수는 충분히 크지 않기 때문에)가 발생합니다. 나는이 응용 프로그램을 몇 번 실행하려고 시도했지만 3 000 000 반복으로 45 초 동안 (true (true) 및 Thread.Sleep (45000) 동안) 쓰도록했습니다. 우선 순위가 높은 작업이 먼저 완료되었습니다.

OS, CPU 및 PC 구성이 중요합니다.