산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C# - 멀티스레딩

스레드 프로그램의 실행 경로로 정의됩니다. 각 스레드는 고유한 제어 흐름을 정의합니다. 응용 프로그램에 복잡하고 시간이 많이 걸리는 작업이 포함된 경우 각 스레드가 특정 작업을 수행하도록 다른 실행 경로 또는 스레드를 설정하는 것이 종종 도움이 됩니다.

스레드는 경량 프로세스입니다. . 스레드를 사용하는 일반적인 예는 최신 운영 체제에서 동시 프로그래밍을 구현하는 것입니다. 스레드를 사용하면 CPU 주기의 낭비를 줄이고 애플리케이션의 효율성을 높일 수 있습니다.

지금까지 우리는 단일 스레드가 애플리케이션의 실행 인스턴스인 단일 프로세스로 실행되는 프로그램을 작성했습니다. 그러나 이 방법으로 응용 프로그램은 한 번에 하나의 작업을 수행할 수 있습니다. 한 번에 둘 이상의 작업을 실행하려면 더 작은 스레드로 나눌 수 있습니다.

스레드 수명 주기

스레드의 수명 주기는 System.Threading.Thread 클래스의 개체가 생성될 때 시작되어 스레드가 종료되거나 실행이 완료될 때 종료됩니다.

다음은 스레드 수명 주기의 다양한 상태입니다 -

주요 스레드

C#에서 System.Threading.Thread 클래스는 스레드 작업에 사용됩니다. 다중 스레드 응용 프로그램에서 개별 스레드를 만들고 액세스할 수 있습니다. 프로세스에서 실행되는 첫 번째 스레드를 메인이라고 합니다. 스레드.

C# 프로그램이 실행을 시작하면 기본 스레드가 자동으로 생성됩니다. 스레드를 사용하여 생성된 스레드 클래스는 메인 스레드의 자식 스레드라고 합니다. CurrentThread를 사용하여 스레드에 액세스할 수 있습니다. Thread 클래스의 속성입니다.

다음 프로그램은 메인 스레드 실행을 보여줍니다 -

라이브 데모
using System;
using System.Threading;

namespace MultithreadingApplication {
   class MainThreadProgram {
      static void Main(string[] args) {
         Thread th = Thread.CurrentThread;
         th.Name = "MainThread";
         
         Console.WriteLine("This is {0}", th.Name);
         Console.ReadKey();
      }
   }
}

위의 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다. -

This is MainThread

스레드 클래스의 속성 및 메서드

다음 표는 가장 일반적으로 사용되는 몇 가지 속성을 보여줍니다. 스레드 클래스 -

시니어 번호 속성 및 설명
1

현재 컨텍스트

스레드가 실행 중인 현재 컨텍스트를 가져옵니다.

2

현재 문화

현재 스레드의 문화권을 가져오거나 설정합니다.

3

현재 원칙

스레드의 현재 보안 주체를 가져오거나 설정합니다(역할 기반 보안용).

4

현재 스레드

현재 실행 중인 스레드를 가져옵니다.

5

현재 UICulture

리소스 관리자가 런타임에 문화권별 리소스를 조회하는 데 사용하는 현재 문화권을 가져오거나 설정합니다.

6

실행 컨텍스트

현재 스레드의 다양한 컨텍스트에 대한 정보가 포함된 ExecutionContext 개체를 가져옵니다.

7

살아있다

현재 스레드의 실행 상태를 나타내는 값을 가져옵니다.

8

배경이

스레드가 백그라운드 스레드인지 여부를 나타내는 값을 가져오거나 설정합니다.

9

IsThreadPoolThread

스레드가 관리되는 스레드 풀에 속하는지 여부를 나타내는 값을 가져옵니다.

10

관리되는 스레드 ID

현재 관리되는 스레드의 고유 식별자를 가져옵니다.

11

이름

스레드의 이름을 가져오거나 설정합니다.

12

우선순위

스레드의 스케줄링 우선 순위를 나타내는 값을 가져오거나 설정합니다.

13

스레드 상태

현재 스레드의 상태를 포함하는 값을 가져옵니다.

다음 표는 가장 일반적으로 사용되는 방법 중 일부를 보여줍니다. 스레드 클래스 -

시니어 번호 방법 및 설명
1

공개 무효 Abort()

스레드 종료 프로세스를 시작하기 위해 호출된 스레드에서 ThreadAbortException을 발생시킵니다. 이 메서드를 호출하면 일반적으로 스레드가 종료됩니다.

2

공개 정적 LocalDataStoreSlot AllocateDataSlot()

모든 스레드에 이름 없는 데이터 슬롯을 할당합니다. 더 나은 성능을 위해 ThreadStaticAttribute 속성으로 표시된 필드를 대신 사용하십시오.

3

공개 정적 LocalDataStoreSlot AllocateNamedDataSlot(문자열 이름)

모든 스레드에 명명된 데이터 슬롯을 할당합니다. 더 나은 성능을 위해 ThreadStaticAttribute 속성으로 표시된 필드를 대신 사용하십시오.

4

공개 정적 무효 BeginCriticalRegion()

스레드 중단 또는 처리되지 않은 예외의 영향이 애플리케이션 도메인의 다른 작업을 위태롭게 할 수 있는 코드 영역으로 실행이 시작될 것임을 호스트에 알립니다.

5

공개 정적 무효 BeginThreadAffinity()

관리 코드가 현재 물리적 운영 체제 스레드의 ID에 의존하는 명령을 실행하려고 함을 호스트에 알립니다.

6

공개 정적 무효 EndCriticalRegion()

스레드 중단 또는 처리되지 않은 예외의 영향이 현재 작업으로 제한되는 코드 영역으로 실행이 시작될 것임을 호스트에 알립니다.

7

공개 정적 무효 EndThreadAffinity()

관리 코드가 현재 물리적 운영 체제 스레드의 ID에 의존하는 명령 실행을 완료했음을 호스트에 알립니다.

8

공개 정적 무효 FreeNamedDataSlot(문자열 이름)

프로세스의 모든 스레드에 대해 이름과 슬롯 간의 연결을 제거합니다. 더 나은 성능을 위해 ThreadStaticAttribute 속성으로 표시된 필드를 대신 사용하십시오.

9

공개 정적 개체 GetData(LocalDataStoreSlot 슬롯)

현재 스레드의 현재 도메인 내에서 현재 스레드의 지정된 슬롯에서 값을 검색합니다. 더 나은 성능을 위해 ThreadStaticAttribute 속성으로 표시된 필드를 대신 사용하십시오.

10

공개 정적 AppDomain GetDomain()

현재 스레드가 실행 중인 현재 도메인을 반환합니다.

11

공개 정적 AppDomain GetDomainID()

고유한 애플리케이션 도메인 식별자를 반환합니다.

12

공개 정적 LocalDataStoreSlot GetNamedDataSlot(문자열 이름)

명명된 데이터 슬롯을 찾습니다. 더 나은 성능을 위해 ThreadStaticAttribute 속성으로 표시된 필드를 대신 사용하십시오.

13

공개 무효 인터럽트()

WaitSleepJoin 스레드 상태에 있는 스레드를 중단합니다.

14

공개 무효 Join()

표준 COM 및 SendMessage 펌핑을 계속 수행하면서 스레드가 종료될 때까지 호출 스레드를 차단합니다. 이 메서드에는 다른 오버로드된 형식이 있습니다.

15

공개 정적 무효 MemoryBarrier()

다음과 같이 메모리 액세스를 동기화합니다. 현재 스레드를 실행하는 프로세서는 MemoryBarrier에 대한 호출 이전의 메모리 액세스가 MemoryBarrier에 대한 호출 이후의 메모리 액세스 후에 실행되는 방식으로 명령을 재정렬할 수 없습니다.

16

공개 정적 무효 ResetAbort()

현재 스레드에 대해 요청된 중단을 취소합니다.

17

공개 정적 무효 SetData(LocalDataStoreSlot 슬롯, 개체 데이터)

해당 스레드의 현재 도메인에 대해 현재 실행 중인 스레드의 지정된 슬롯에 데이터를 설정합니다. 더 나은 성능을 위해 대신 ThreadStaticAttribute 속성으로 표시된 필드를 사용하십시오.

18

공개 무효 Start()

스레드를 시작합니다.

19

공개 정적 무효 절전(int millisecondsTimeout)

일정 시간 동안 스레드를 일시 중지합니다.

20

공개 정적 무효 SpinWait(int iterations)

스레드가 iterations 매개변수에 의해 정의된 횟수만큼 대기하도록 합니다.

21

공개 정적 바이트 VolatileRead(참조 바이트 주소)

공개 정적 이중 VolatileRead(참조 이중 주소)

공개 정적 정수 VolatileRead(참조 정수 주소)

공개 정적 개체 VolatileRead(참조 개체 주소)

필드 값을 읽습니다. 이 값은 프로세서 수 또는 프로세서 캐시 상태에 관계없이 컴퓨터의 모든 프로세서에서 가장 최근에 작성한 것입니다. 이 메서드에는 다른 오버로드된 형식이 있습니다. 일부만 위에 나와 있습니다.

22

공개 정적 무효 VolatileWrite(참조 바이트 주소, 바이트 값)

공개 정적 무효 VolatileWrite(참조 이중 주소, 이중 값)

공개 정적 무효 VolatileWrite(참조 int 주소, int 값)

공개 정적 무효 VolatileWrite(참조 개체 주소, 개체 값)

값을 컴퓨터의 모든 프로세서에서 볼 수 있도록 필드에 즉시 값을 씁니다. 이 메서드에는 다른 오버로드된 형식이 있습니다. 일부만 위에 나와 있습니다.

23

공개 정적 bool Yield()

호출 스레드가 현재 프로세서에서 실행할 준비가 된 다른 스레드에 실행을 양보하도록 합니다. 운영 체제는 양보할 스레드를 선택합니다.

스레드 생성

스레드는 Thread 클래스를 확장하여 생성됩니다. 확장된 Thread 클래스는 Start() 자식 스레드 실행을 시작하는 메서드입니다.

다음 프로그램은 개념을 보여줍니다 -

라이브 데모
using System;
using System.Threading;

namespace MultithreadingApplication {
   class ThreadCreationProgram {
      public static void CallToChildThread() {
         Console.WriteLine("Child thread starts");
      }
      static void Main(string[] args) {
         ThreadStart childref = new ThreadStart(CallToChildThread);
         Console.WriteLine("In Main: Creating the Child thread");
         Thread childThread = new Thread(childref);
         childThread.Start();
         Console.ReadKey();
      }
   }
}

위의 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다. -

In Main: Creating the Child thread
Child thread starts

스레드 관리

Thread 클래스는 스레드를 관리하기 위한 다양한 메소드를 제공합니다.

다음 예는 sleep() 특정 시간 동안 스레드를 일시 중지하는 방법입니다.

라이브 데모
using System;
using System.Threading;

namespace MultithreadingApplication {
   class ThreadCreationProgram {
      public static void CallToChildThread() {
         Console.WriteLine("Child thread starts");
         
         // the thread is paused for 5000 milliseconds
         int sleepfor = 5000; 
         
         Console.WriteLine("Child Thread Paused for {0} seconds", sleepfor / 1000);
         Thread.Sleep(sleepfor);
         Console.WriteLine("Child thread resumes");
      }
      
      static void Main(string[] args) {
         ThreadStart childref = new ThreadStart(CallToChildThread);
         Console.WriteLine("In Main: Creating the Child thread");
         
         Thread childThread = new Thread(childref);
         childThread.Start();
         Console.ReadKey();
      }
   }
}

위의 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다. -

In Main: Creating the Child thread
Child thread starts
Child Thread Paused for 5 seconds
Child thread resumes

스레드 파괴

중단() 메소드는 스레드를 파괴하는 데 사용됩니다.

런타임은 ThreadAbortException을 발생시켜 스레드를 중단합니다. . 이 예외는 잡을 수 없으며 컨트롤은 마침내 차단합니다.

다음 프로그램은 이것을 보여줍니다 -

라이브 데모
using System;
using System.Threading;

namespace MultithreadingApplication {
   class ThreadCreationProgram {
      public static void CallToChildThread() {
         try {
            Console.WriteLine("Child thread starts");
            
            // do some work, like counting to 10
            for (int counter = 0; counter <= 10; counter++) {
               Thread.Sleep(500);
               Console.WriteLine(counter);
            }
            
            Console.WriteLine("Child Thread Completed");
         } catch (ThreadAbortException e) {
            Console.WriteLine("Thread Abort Exception");
         } finally {
            Console.WriteLine("Couldn't catch the Thread Exception");
         }
      }
      static void Main(string[] args) {
         ThreadStart childref = new ThreadStart(CallToChildThread);
         Console.WriteLine("In Main: Creating the Child thread");
         
         Thread childThread = new Thread(childref);
         childThread.Start();
         
         //stop the main thread for some time
         Thread.Sleep(2000);
         
         //now abort the child
         Console.WriteLine("In Main: Aborting the Child thread");
         
         childThread.Abort();
         Console.ReadKey();
      }
   }
}

위의 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다. -

In Main: Creating the Child thread
Child thread starts
0
1
2
In Main: Aborting the Child thread
Thread Abort Exception
Couldn't catch the Thread Exception 

C 언어

  1. 패스너의 작은 나사 대 대 나사 지름
  2. 스레드
  3. 스레드 대. ZigBee(IoT 엔지니어용)
  4. 스레드 처리 옵션 분석
  5. C++ 멀티스레딩
  6. Python - 다중 스레드 프로그래밍
  7. 엣지 컴퓨팅, 마침내 프레임워크 확보
  8. 후면 조명이 빨라짐
  9. 디지털 스레드 이해하기
  10. 실 절단기란 무엇입니까?