c# thread 예제

절전 또는 조인을 기다리는 동안 스레드가 차단되므로 CPU 리소스가 소모되지 않습니다. 다음 예제는 Thread(ParameterizedThreadStart) 생성자 호출을 제외 하 고 이전 예제와 동일 합니다. 이 버전의 ExecuteInForground 메서드에는 루프가 실행할 대략적인 밀리초 수를 나타내는 단일 매개 변수가 있습니다. ASP.NET 및 WCF와 같은 기술을 사용하면 적절한 잠금 없이 공유 데이터(정적 필드를 통해)에 액세스하지 않고 스레드 안전의 위반을 실행하지 않는 한 멀티스레딩이 이루어지고 있다는 사실을 인식하지 못할 수 있습니다. 기본적으로 명시적으로 만드는 스레드는 전경 스레드입니다. 포그라운드 스레드는 응용 프로그램 중 하나가 실행 중인 동안 응용 프로그램을 계속 유지하지만 백그라운드 스레드는 실행되지 않습니다. 모든 전경 스레드가 완료되면 응용 프로그램이 종료되고 실행 중인 모든 백그라운드 스레드가 갑자기 종료됩니다. 모든 스레드에 명명되지 않은 데이터 슬롯을 할당합니다. 성능을 향상하기 위해 대신 ThreadStaticAttribute 특성으로 표시된 필드를 사용합니다. 단일 프로세서 컴퓨터에서 스레드 스케줄러는 시간 분할을 수행하여 각 활성 스레드 간에 실행을 빠르게 전환합니다. Windows에서 시간 조각은 일반적으로 수십 밀리초 지역에 있으며 실제로 한 스레드와 다른 스레드 간에 컨텍스트를 전환하는 CPU 오버헤드보다 훨씬 큽니다(일반적으로 몇 마이크로초 영역).

설명: 위의 예제에서는 mythread1()라는 비정적 메서드를 포함하는 ExThread라는 클래스가 있습니다. 따라서 ExThread 클래스의 obj 와 이 문에서 주어진 대로 ThreadStart 클래스의 생성자에서 참조 하는 인스턴스를 만듭니다 . 스레드 a = 새 스레드(새 스레드 시작(obj.mythread1))를 사용); 문 우리는 thr로 명명 된 스레드를 만들고이 스레드의 작업을 초기화 할 것입니다. Thr를 사용 하 여. 시작(); 문을. 준비 상태 – 그것은 스레드가 실행하고 CPU 주기를 기다리고 준비가될 때 상황이다. 절전(0) 또는 수율은 고급 성능 조정을 위한 프로덕션 코드에서 유용할 수 있습니다. 또한 스레드 안전 문제를 발견하는 데 도움이되는 훌륭한 진단 도구입니다 : 코드의 아무 곳이나 Thread.Yield()를 삽입하면 프로그램이 만들거나 중단되면 거의 확실하게 버그가 있습니다. 이 두 가지 예는 스레드 안전 (또는 오히려 부족)의 또 다른 주요 개념을 보여줍니다.

출력은 실제로 확정되지 않습니다 : «Done»을 두 번 인쇄 할 수 있습니다 (가능성은 낮지만). 그러나 Go 메서드에서 명령문의 순서를 교환하는 경우 실시간 응용 프로그램에 사용자 인터페이스가 있는 경우 프로세스 우선 순위를 높이면 화면 업데이트에 과도한 CPU 시간이 주어 화면 이 속도가 느려질 수 있습니다. 전체 컴퓨터(특히 UI가 복잡한 경우). 프로세스의 우선 순위를 높이는 것과 함께 주 스레드의 우선 순위를 낮추면 실시간 스레드가 화면 다시 그리기로 선점되지 않지만 작동 하기 때문에 CPU 시간의 다른 응용 프로그램을 굶주리게하는 문제를 해결하지 못합니다. 시스템은 여전히 프로세스 전체에 불균형한 리소스를 할당합니다.