여기서 주목해야 할 점은 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)를 주목해주세요!