C 언어
스레드 프로그램의 실행 경로로 정의됩니다. 각 스레드는 고유한 제어 흐름을 정의합니다. 응용 프로그램에 복잡하고 시간이 많이 걸리는 작업이 포함된 경우 각 스레드가 특정 작업을 수행하도록 다른 실행 경로 또는 스레드를 설정하는 것이 종종 도움이 됩니다.
스레드는 경량 프로세스입니다. . 스레드를 사용하는 일반적인 예는 최신 운영 체제에서 동시 프로그래밍을 구현하는 것입니다. 스레드를 사용하면 CPU 주기의 낭비를 줄이고 애플리케이션의 효율성을 높일 수 있습니다.
지금까지 우리는 단일 스레드가 애플리케이션의 실행 인스턴스인 단일 프로세스로 실행되는 프로그램을 작성했습니다. 그러나 이 방법으로 응용 프로그램은 한 번에 하나의 작업을 수행할 수 있습니다. 한 번에 둘 이상의 작업을 실행하려면 더 작은 스레드로 나눌 수 있습니다.
스레드의 수명 주기는 System.Threading.Thread 클래스의 개체가 생성될 때 시작되어 스레드가 종료되거나 실행이 완료될 때 종료됩니다.
다음은 스레드 수명 주기의 다양한 상태입니다 -
시작되지 않은 상태 − 스레드의 인스턴스가 생성되었지만 Start 메소드가 호출되지 않은 상황입니다.
준비 상태 − 스레드가 실행 준비가 되어 CPU 주기를 기다리는 상황입니다.
실행 불가 상태 − 다음과 같은 경우 스레드를 실행할 수 없습니다.
죽은 상태 − 스레드가 실행을 완료하거나 중단된 상황입니다.
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 언어
무결함, 초미세 표면 품질을 특징으로 하는 새로운 인서트 코팅 기술은 나사 회전 중 인서트가 직면하는 절삭 부하. 사진 제공:GenSwiss 생산 기계 의 독자로서 잡지에서, CNC Swiss 선반 기술에 이미 투자했거나 미래에 그렇게 하는 데 매우 큰 관심을 갖고 있을 가능성이 매우 높습니다. 아마도 이러한 기계가 할 수 있는 정밀도의 수준이거나 장기 실행, 대량 생산 작업을 고려 중이며 이 장비가 제공하는 기능 유형이 필요할 수 있습니다. 한 가지는 확실합니다. 스레딩 작업은 거의 모든 스위스 기계 공장에서 접하게 되는 일이
Siemens Sinumerik 840C/840 Sinumerik 810/820T 사이클 L97 나사 절삭 사이클은외부 나사 절삭내부 스레딩테이퍼 스레딩가로 나사에 사용할 수 있습니다. 공구 인피드는 자동이며 점진적으로 2차입니다. 이렇게 하면 절단 단면이 일정하게 유지됩니다. 프로그램 예는 외부 스레딩용 Sinumerik L97 나사 절삭 주기 프로그램 예를 참조하십시오. Sinumerik L97 나사 절삭 사이클 L97 나사 절삭 주기 매개변수 R20 – 나사산 피치.R21 – X축 나사산 시작점.R22 – Z축 나사산