C#의 멀티스레딩 메커니즘에 대한 예비 연구(3)

黄舟
풀어 주다: 2016-12-21 15:00:11
원래의
1010명이 탐색했습니다.

여기서 주목해야 할 점은 Main() 함수가 위치한 스레드에 다른 스레드가 연결된다는 것입니다. Main() 함수는 C# 프로그램의 입구입니다. 모든 포그라운드 스레드가 중지되면 메인 스레드가 종료될 수 있으며 모든 백그라운드 스레드가 무조건 종료됩니다. 마이크로 관점에서는 모든 스레드가 순차적으로 실행되지만 매크로 관점에서는 병렬로 실행된다고 생각할 수 있습니다.

 독자들은 Thread.ThreadState 속성을 주목했을 것입니다. 이 속성은 상황에 따라 다른 값을 가지므로 때때로 프로그램 흐름을 판단하여 설계할 수 있습니다. . 다양한 상황에서 가능한 ThreadState 값은 다음과 같습니다.

Aborted: 스레드가 중지되었습니다.
AbortRequested: 스레드의 Thread.Abort() 메서드가 호출되었지만 스레드가 아직 중지되지 않았습니다.
Background: Thread.IsBackground 속성과 관련된 스레드가 백그라운드에서 실행됩니다.
Running: 스레드가 정상적으로 실행 중입니다.
Stopped: 스레드가 중지되었습니다.
StoPRequested: 스레드에 요청 중입니다. stop
Suspended: 스레드가 일시 중단되었습니다(이 상태에서는 Resume() 메서드를 호출하여 다시 실행할 수 있습니다)
SuspendRequested: 스레드가 일시 중단을 요청하고 있지만 앞으로 응답이 없습니다
Unstarted: 스레드 실행을 시작하기 위해 Thread.Start()가 호출되지 않았습니다.
WaitSleepJoin: Wait(), Sleep() 또는 Join()과 같은 메서드 호출로 인해 스레드가 차단된 상태입니다.

위에서 언급한 Background 상태는 스레드가 백그라운드에서 실행되고 있음을 나타내는데, 백그라운드에서 실행되는 스레드의 특별한 점은 무엇인가요? 실제로, 백그라운드 스레드와 포그라운드 스레드 사이에는 단 하나의 차이점이 있습니다. 즉, 백그라운드 스레드는 프로그램 종료를 막지 않습니다. 프로세스의 모든 포그라운드 스레드가 종료되면 CLR(공용 언어 런타임 환경)은 남아 있는 백그라운드 프로세스의 Abort() 메서드를 호출하여 프로세스를 완전히 종료합니다.

스레드가 CPU 시간을 놓고 경쟁할 때 CPU는 스레드의 우선순위에 따라 서비스를 제공합니다. C# 애플리케이션에서 사용자는 높음부터 낮음까지 5가지 우선순위(Highest, AboveNormal, Normal, BelowNormal, Lowest)를 설정할 수 있습니다. 스레드를 생성할 때 우선순위를 지정하지 않으면 시스템은 ThreadPriority.Normal로 기본 설정됩니다. 스레드
에 우선순위를 할당하려면 다음 코드를 사용할 수 있습니다.

//우선순위를 가장 낮은 값으로 설정
myThread.Priority=ThreadPriority.Lowest;

스레드의 우선순위를 설정하면 사용자에 대한 응답 등 상대적으로 중요한 일부 스레드가 먼저 실행되도록 배열할 수 있습니다.

스레드를 생성하고 제어하는 ​​방법에 대한 사전 이해를 마쳤으므로 이제 스레드 구현의 보다 일반적인 문제를 살펴보고 해결 방법을 살펴보겠습니다.

3. 스레드 동기화 및 통신 - 생산자와 소비자

 두 스레드가 동시에 대기열을 유지하고 다른 스레드가 대기열에 요소를 추가하는 상황을 가정해 보겠습니다. 대기열에서 요소를 가져온 다음 해당 요소를 추가하는 스레드를 생산자, 요소를 가져오는 스레드를 소비자라고 부릅니다. 생산자-소비자 문제는 간단해 보이지만 멀티 스레드 응용 프로그램에서는 반드시 해결해야 할 문제입니다. 스레드 간의 동기화 및 통신 문제가 관련됩니다.

앞서 언급했듯이 각 스레드는 자체 리소스를 가지지만 코드 영역은 공유됩니다. 즉, 각 스레드는 동일한 기능을 실행할 수 있습니다. 그러나 멀티 스레드 환경에서는 여러 스레드가 동시에 함수를 실행하여 데이터 혼란과 예측할 수 없는 결과를 초래하는 문제가 발생할 수 있으므로 이러한 상황을 피해야 합니다. C#은 코드 섹션을 임계 섹션으로 정의할 수 있는 키워드 잠금을 제공합니다. 상호 배타적 섹션에서는 한 번에 하나의 스레드만 실행에 들어가고 다른 스레드는 기다려야 합니다. C#에서는 lock 키워드를 다음과 같이 정의합니다.

lock(expression)statement_block

위는 C#의 멀티스레딩 메커니즘(3)에 대한 사전 탐색 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿