multithreading c with examples
C ++의 멀티 스레딩에 대한 간략한 소개.
이 튜토리얼에서는 C ++의 멀티 스레딩에 대한 개요를 얻습니다.
그래서 스레드는 무엇입니까? 스레드는 특정 프로세스의 작업 단위입니다. 다중 프로그래밍 운영 체제에서는 서로 다른 프로세스가 동시에 실행됩니다.
비슷한 방식으로 동일한 프로세스 인스턴스를 동시에 실행하려고 할 수 있습니다. 이 경우 각 프로세스 인스턴스는 스레드라는 실행 단위에 할당됩니다. 멀티 스레딩 시스템에서는 수많은 스레드가 서로 독립적으로 동시에 실행됩니다.
C ++ 11 이전에는 POSIX 스레드 지원이있었습니다. 그러나이 기능은 Linux 또는 UNIX 운영 체제에서만 작동하므로 심각한 이식성 문제가있었습니다. 따라서 C ++ 11부터는 단일 클래스가 있습니다. std :: 스레드 스레드의 모든 기능을 정의합니다. 클래스와 함수는 헤더 파일에 정의되어 있습니다.
학습 내용 :
작업
std :: thread를 사용하여 새 스레드 객체를 생성하고이를 콜 러블에 전달하기 만하면됩니다. 콜 러블은 스레드가 실행 중일 때 실행하려는 실행 코드입니다. 따라서 새 스레드를 원할 때마다 std :: thread의 객체를 생성하고 콜 러블을 생성자에 인수로 전달합니다.
std :: thread 객체가 생성되면 새 스레드가 시작되고 callable에서 제공하는 코드가 실행됩니다.
스레드 객체에 제공 할 콜 러블을 정의하는 방법을 살펴 보겠습니다.
콜 러블은 세 가지 방법으로 정의 할 수 있습니다.
# 1) 함수 개체 사용
스레드 객체에서 함수 객체를 콜러 블로 사용할 수 있습니다. 함수 객체를 사용하려면 클래스가 있어야하며 해당 클래스에서 연산자 ()를 오버로드합니다. 이 오버로드 된 함수에는 스레드가 생성 될 때 실행될 코드가 포함되어 있습니다.
/ / Define the class for function object class functioObject_class { // Overload () operator void operator()(params) { // code to be executed } }; // Create thread object
std::thread thread_object(functioObject_class (), params)
스레드 개체가 정의되는 방식에 유의하십시오. 스레드 객체 생성자에 대한 첫 번째 매개 변수로 오버로드 된 함수를 제공 한 다음 두 번째 인수로 인수 (params)를 지정합니다.
# 2) 함수 포인터 사용
함수 포인터를 사용하는 콜 러블은 다음과 같은 방법으로 정의 할 수 있습니다.
void funct_call(params) //code to be executed }
이 함수를 정의하면 다음과 같은 방법으로이 함수를 호출 가능한 스레드 객체로 만들 수 있습니다.
std::thread thread_obj(funct_call, params);
함수에 전달 된 인수 (매개 변수)는 스레드 개체의 함수 이름 뒤에 제공됩니다.
# 3) 람다 식 사용
콜 러블을 람다 식으로 가질 수 있으며 실행을 위해 스레드 개체에 전달할 수도 있습니다. 동일한 코드 조각이 아래에 나와 있습니다.
// Define a lambda expression auto f = ()(params) { // code for execution };
std::thread thread_object(f, params);
위의 코드에서 우리는 람다 식 f를 정의한 다음 첫 번째 인수로 스레드 객체 생성자에 전달하고 두 번째 인수로 매개 변수 (params)를 전달합니다.
std::thread join method
어떤 경우에는 다른 작업을 시작하기 전에 현재 실행중인 스레드가 완료되기를 원할 수 있습니다.
전형적인 예는 GUI 애플리케이션을 열 때입니다. 응용 프로그램을 여는 순간 GUI를로드하고 초기화하는 스레드가 시작되고 GUI가 제대로 작동하는지 확인하기 위해로드 및 초기화가 올바르게 수행되지 않으면 작업을 수행 할 수 없습니다.
std :: thread 클래스는 다른 작업이 수행되기 전에 현재 스레드 (* this가 가리키는)가 먼저 완료되도록하는 join () 메서드를 제공합니다.
다음 예를 들어,
기본 게이트웨이를 사용할 수 없습니다. Windows 7
int main() { std::thread t1(callable_code); ….. t1.join(); ….. }
위의 예에서 주 함수는 스레드 t1이 완료 될 때까지 계속 기다려야합니다. 일반적으로 스레드의 조인 기능은 스레드 호출이 실행을 완료 할 때까지 다른 작업 / 기능을 차단합니다.
스레드의 예
아래에 표시된 프로그램에서 스레드 생성 및 실행에 대한 완전한 코딩 예제를 제공합니다.
#include #include using namespace std; // function to be used in callable void func_dummy(int N) { for (int i = 0; i 산출:
스레드 1 :: 호출 가능 => 함수 포인터
스레드 1 :: 호출 가능 => 함수 포인터
스레드 3 :: 호출 가능 => 람다 식
스레드 3 :: 호출 가능 => 람다 식
스레드 2 :: 호출 가능 => 함수 객체
스레드 2 :: 호출 가능 => 함수 객체
위의 예에서 우리는 함수 포인터, 객체 및 람다 식과 같은 세 가지 다른 호출 가능 항목을 사용하여 세 개의 스레드를 만들었습니다. 각 스레드의 2 개의 인스턴스를 만들고 시작합니다. 출력에서 볼 수 있듯이 세 개의 스레드는 서로 독립적으로 동시에 작동합니다.
추천 읽기 = >> 스레드 테스트 가이드
결론
이 튜토리얼에서는 명확한 예제를 통해 C ++의 멀티 스레딩 개념을 살펴 보았습니다. 다음 튜토리얼에서는 강력하고 효율적인 프로그램을 작성하는 데 도움이되는 더 많은 C ++ 주제를 학습합니다.
추천 도서