C++에서 멀티스레딩을 구현하는 방법

C Eseo Meoltiseuleding Eul Guhyeonhaneun Bangbeob



C++의 멀티스레딩은 동시에 여러 작업을 동시에 수행할 수 있는 기능입니다. 스레드는 실행 중인 특정 프로세스의 작업 단위입니다. 멀티스레딩을 수행하기 위해 수많은 스레드가 동시에 독립적으로 실행됩니다.

C++에서 멀티스레딩을 구현하는 방법

멀티스레드 프로그램에는 동시에 실행되는 경향이 있는 두 개 이상의 부분이 있으며, 각 부분은 스레드로 알려져 있으며 실행 경로가 다릅니다. 멀티스레딩을 수행하기 위해 수많은 스레드가 동시에 독립적으로 실행됩니다.







C++의 멀티스레딩을 위한 전제 조건

Windows에서는 스레드와 관련된 기능을 C++ 11 및 고급 버전에서 수행할 수 있습니다. Dev-C++ 컴파일러를 사용하는 동안 기본적으로 C++ 3 버전에 있으므로 수동으로 C++ 11 버전으로 변경해야 합니다. 언어 표준 설정을 변경하여 GNU C++11 환경을 선택할 수 있습니다.



Dev-C++ 컴파일러를 열고 작업 표시줄의 '도구'로 이동합니다. '컴파일러 옵션'을 선택한 다음 '설정'을 선택하고 '코드 생성' 블록을 클릭하면 명령 목록이 나타납니다. “Language Standard(-std)”에서 GNU C++11을 선택하고 확인을 클릭합니다. 이제 이 컴파일러는 스레드 작업을 지원하도록 모두 설정되었습니다.




GitHub에서 라이브러리 다운로드 Cpp 컴파일러의 lib 폴더에 넣습니다. #include 'mingw.thread.h' 및 헤더 파일을 사용하여 프로그램에서 이러한 라이브러리를 호출합니다. 구문은 다음과 같습니다.





표준::스레드 thread_object ( 호출 가능 ) ;


std::thread는 C++11의 #include 'mingw.thread.h' 헤더 파일에서 지원됩니다. 스레드 클래스이며 단일 스레드를 나타냅니다. std::thread를 사용하여 새 스레드가 생성되고 콜러블이 전달됩니다. Callable은 스레드가 실행될 때 실행되는 실행 가능 코드입니다. Callable은 아래 세 가지 유형 중 하나일 수 있습니다.

객체가 생성되면 콜러블의 코드를 실행하는 새 스레드가 시작됩니다.



함수 객체를 사용하여 스레드 시작

함수 객체는 스레드를 시작하기 위한 호출 가능 항목으로 사용될 수 있으며, 오버로드 연산자()는 이를 호출 가능하게 만듭니다.

클래스 function_object_class {
무효 연산자 ( ) ( 매개변수 )
{
진술서;
}
}
표준::스레드 thread_object ( 함수_객체_클래스 ( ) , 매개변수 )


오버로드 함수는 생성자에 첫 번째 객체로 제공되고 명령문은 두 번째 객체로 제공됩니다.

함수 포인터를 사용하여 스레드 실행

함수 포인터가 정의된 다음 스레드를 시작하기 위한 호출 가능 항목으로 사용됩니다.

무효 function_call ( 매개변수 )
{
진술서;
}
표준::스레드 thread_obj ( function_call, 매개변수 ) ;


전달될 인수는 함수 이름 뒤에 작성됩니다.

람다 표현식을 사용하여 스레드 실행

스레드 개체는 람다를 호출 가능 개체로 사용하여 시작할 수 있습니다.

// 람다 식 정의
자동 f = [ ] ( 매개변수 )
{
진술서;
} ;

표준::스레드 thread_object ( f, 매개변수 ) ;


람다 표현식이 정의되고 스레드를 시작하기 위해 매개변수가 호출됩니다.

어떤 경우에는 스레드가 다음 명령 실행을 시작하기 전에 중지되어야 합니다. 그만큼 std::스레드::조인() 함수는 스레드가 끝날 때까지 기다리는 데 사용됩니다. 예를 들어 스레드에 GUI 작업을 할당하는 경우 먼저 GUI를 올바르게 로드하고 다음 명령이 실행되기 위해서는 완료 시간을 기다려야 합니다.

정수 메인 ( )
{

표준::스레드 t1 ( 호출 가능 ) ;
t1.join ( ) ;
진술서;
}

세 가지 콜러블을 모두 사용하여 멀티스레딩을 수행하기 위해 실행되는 프로그램입니다. 세 가지 다른 호출 가능 항목은 서로 방해받지 않고 해당 명령을 동시에 세 번 실행합니다.

#include
#include <스레드>
네임스페이스 std 사용;


무효 foo ( 정수 Z )
{
~을 위한 ( 정수 나는 = 0 ; 나 < 지; 나++ ) {
시합 << '스레드를 이용한 함수'
' 호출 가능한 포인터 \N ' ;
}
}


클래스 thread_obj {
공공의:
무효 연산자 ( ) ( 정수 x )
{
~을 위한 ( 정수 나는 = 0 ; 나 < 엑스; 나++ )
시합 << '스레드를 이용한 함수'
' 호출 가능한 객체 \N ' ;
}
} ;


// 메인 코드
정수 메인 ( )
{
시합 << '스레드 1, 2, 3'
'독립적으로 운영 중'
<< 끝;


스레드 th1 ( 푸, ) ;


스레드 th2 ( thread_obj ( ) , ) ;


자동 f = [ ] ( 정수 x ) {
~을 위한 ( 정수 나는 = 0 ; 나 < 엑스; 나++ )
시합 << '람다를 사용한 스레드'
' 호출 가능한 표현식 \N ' ;
} ;


스레드 th3 ( 에프, ) ;

th1.join ( ) ;

th2.join ( ) ;

th3.가입 ( ) ;

반품 0 ;
}


이 프로그램에서는 함수 포인터, 함수 객체 및 람다 표현식을 포함한 세 가지 호출 가능 항목을 사용하여 세 개의 스레드를 동시에 시작합니다. 스레드 1, 2, 3은 서로 방해받지 않고 동시에 독립적으로 값을 인쇄합니다. 그들은 값을 세 번 인쇄합니다. Join() 함수는 스레드가 끝날 때까지 기다리는 데 사용됩니다.


세 스레드 모두의 출력이 독립적으로 표시되며 세 번 반복됩니다. 각 스레드는 다른 스레드가 먼저 끝날 때까지 기다립니다.

결론

C++의 멀티스레딩은 동시에 여러 작업을 동시에 수행할 수 있는 기능입니다. 다중 스레드 프로그램에는 동시에 실행될 수 있는 두 개 이상의 섹션이 있으며, 각 부분은 스레드로 알려져 있으며 실행을 위한 별도의 경로가 있습니다. 스레드, 함수 포인터, 함수 개체 및 람다 표현식을 시작하는 세 가지 호출 가능 항목이 있습니다. 이를 통해 멀티스레딩이 가능해집니다.