C ++ 표준 : 스레드 파이썬의 개념을 소개하는 멀티 스레드 및 멀티 프로세스, 멀티 스레드 동기화 차이 파이썬 사례 연구

11 새로운 C ++ 표준, 멀티 스레딩의 개념의 도입의 공식 언어입니다. 새로운 표준은 다중 스레드 C ++ 프로그램을 관리하는 스레드 객체를 생성하여, 스레드 라이브러리 스레드를 제공합니다.

이 글은 간략하게 몇 가지 기본적인 C ++ 관련 개념 및 스레드의 다중 스레드 사용에 대한 이야기.

0이 병렬로 실행될

병렬 실행을위한 두 개의 필요 조건 :

  • 멀티 프로세서 (다중 프로세서), 또는 멀티 코어 프로세서 (멀티 코어 프로세서)
  • 병렬 소프트웨어

소프트웨어의 동시 실행은 두 가지 범주로 나눌 수 있습니다 :

  1. 멀티 스레드 (프로세스와 병렬 다중 스레드);
  2. 더 복잡한 처리 (병렬 다른 공정);

멀티 스레드의 경우, 주요 관심사는 스레드 안전에 대한 스레드 간의 조치를 동기화;

다중 프로세스의 주요 관심사는 프로세스 간의 메시지들 및 데이터를 전달하는 데 사용되는 프로세스 간 통신 메커니즘이다;

C ++ 표준은 특정 플랫폼 API에 의존 할 수있는 여러 프로세스 간의 통신을위한 관련 표준이 아니기 때문에. 이 문서에서는 멀티 스레드 관련에 초점을 맞추고 있습니다.

1. C ++ 멀티 스레드 플랫폼

11, 윈도우 및 리눅스 플랫폼 전에 C ++는 각각 자신의 멀티 스레드 기준을 가지고있다. C ++로 작성된 여러 스레드를 사용하는 것은 종종 특정 플랫폼에 연결되어 있습니다.

  • 생성 및 관리 멀티 스레드는 Win32 API의 윈도우 플랫폼;
  • 리눅스에서, 거기에 멀티 스레드 API의 POSIX 표준은 스레드 또는에서는 Pthreads 라이브러리는 클래스가 유닉스에서 실행할 수 있습니다 제공합니다;

새로운 C (11) ++ 표준에서, 당신은 단순히 hread 라이브러리를 사용하여 여러 스레드를 관리 할 수 ​​있습니다. 쓰레드 라이브러리는 서로 다른 플랫폼, 멀티 스레딩 API의 래퍼로 볼 수있다;

따라서, 새로운 표준 라이브러리를 사용하는 프로그램은 크로스 플랫폼 작성된 것입니다 제공합니다.

2. pthread와의 或의 C ++ 11 스레드

의 pthreads이 라이브러리는 리눅스에서 C ++입니다 스레딩 스레드의 기본 동작에 찬성의 운영과 관련된 일부 스레드를 제공하는 더 직접적이고 편리하다;

사용법 #include <pthread.h를> 
는 pthread_create (스레드 ATTR, start_routine, ARG)

리눅스는 pthread의는 pthread 라이브러리를 연결해야합니다 위해 (편집기는 일부 -std = C ++ (11)가 필요할 수 있음) :

g ++ source.cpp -lpthread -o source.o 

스레드에서 Tucao (11)의 새로운 표준 C ++ 클래스에 대한 많은 온라인이 있습니다,하지만 첫 번째 C ++ 표준 스레드 라이브러리로, 크로스 - 플랫폼으로 인식의 가치 일부 지역은, 사용하기 쉬운이 있지만.

그리고 새로운 표준을 쉽게 관리의 잠금을 달성하기 위해 RAII를 사용할 수 있습니다.

당신은 멀티 스레드, 그래서는 pthread에서 심층적 인 모습을 원한다면 좋은 선택이 될 것입니다. 당신이 크로스 플랫폼 또는 달성하려면 세부 사항에 너무 많은 관심없이 몇 가지 간단한 장면을 멀티 스레드, 표준 라이브러리 스레드의 권한은 최선의 선택입니다.

즉이 잘 맞는, 좋은, 나쁜 점은 없습니다. 당신이 밖으로 찾을 수 있다면 모두 수행 할 수 있습니다. 이 논문은 후자를 설명합니다.

첫 번째 연습 이론 후 (3)

멀티 스레드 관련 학습, 개념 중 일부는 분명 매우 중요한 스레드 관련하다.

이러한 스레드는 이러한 시스템의 처리와 통신 방법 상호 배타적 관계로 스레드 안전성, 스레드 동기화 관계에있다.

그렇지 않으면, 실제 쓰기 멀티 스레드 프로그램은 너무 많은 문제로 실행됩니다 :

  • 교착 상태, 응답 없음;
  • 결과는 기대에 부응하지 않는다;
  • 멀티 스레드 성능이 많이 향상되지 않는다;
  • 혼란 프로그램 실행 방법;
  • 나는 디버깅하는 방법을 모른다;
  • 좋은 시절과 나쁜 프로그램이 실행;

빛 안전,이 혼자 디버거, 추측 결과에 따라하는 것은 가능하지 않다 이해하기 위해 많은 이론이있다.

약 보웬 나사산 파이썬을 소개하는 내 앞의 예를 참조 할 수 있습니다 스레드의 개념에 관한 :

실시 예 4 스레드 스레드

예 ++ 멀티 스레드 C를 만들 수 11 표준 라이브러리의 스레드 봐 :

1 #INCLUDE <iostream>
 2 #INCLUDE <실>
 3 #INCLUDE < 문자열 >
 4  
5  이용  스페이스 성병;
6  
7  INT의 값 TStart ( CONST  문자열TNAME) {
 8      COUT << " 스레드 테스트! " << TNAME << ENDL;
9      복귀  0 ;
10  }
 11  
12  INT 의 main () {
 13      스레드 t (값 TStart, " C ++ 스레드 11! " );
(14)     t.join ();
15      cout과 << " 주요 기능! " << endl의;
16 }

생성 된 스레드를 관리하는 스레드를 사용하여 표준 라이브러리 오브젝트를 멀티 스레딩. 이 예에서, t는 새로운 스레드 객체 스레드를 나타낸다.

스레드를 생성하는 4.1 표준 라이브러리 방법

열기 스레드 헤더 파일, 당신은 명시 적으로 제공된 생성자 스레드를 볼 수 있습니다.

  1. 기본 생성자 스레드 (noexcept); 
  2. 매개 변수 템플릿 생성자 함수를 수신하고 전달하는 <클래스 _Fn, 클래스 ... _Args, ...> 명시 적으로 스레드 (_Fn && _Fx, _Args && ... _Ax)
  3. 이동 构造 函数 스레드 (스레드 && _Other) noexcept;
  4. 복사 생성자 스레드 (CONST 스레드 &) = 삭제;
  5. 대입 연산자 복사 스레드 = & 연산자 (& CONST 스레드) = 삭제;

상기 복사 생성자와 대입 연산자의 사본을 복사하여 다른 스레드 객체에 할당 할 수 없습니다 표준 : 스레드 객체를 의미 사용할 수 없습니다;

기본 생성자는 빈 스레드 오브젝트를 구축하지만, 어떤 스레드를 대표하지 않는다;

생성자는 스레드는 오브젝트의 수신 기능의 실행이 시작이고 결합 가능한 파라미터 스레드 객체를 작성 허용;

이동 생성자는 다른 스레드 객체 스레드 오브젝트 제어 권한 스레드로 간주 될 수 있으며, 실행 한 후, 수신 쓰레드 객체가 어떤 스레드를 나타내지 않는다;

INT 의 main () 
{ 
    INT ARG = 0 ; 
    표준 : 스레드 T1;                        // T1은 스레드 표현되지 
    표준 : 스레드 T2 (FUNC1, ARG + 1 );     // 값으로 스레드로 전달 
    표준 : 스레드 T3 (FUNC2, 성병 :: REF (ARG))를;  // 참조하여 스레드에 전달 
    표준 : 스레드 (T4) (표준 : 이동 (T3))를;         // T4 지금 FUNC2를 실행 (). T3는 더 이상 스레드입니다
     // t1.join () 오류! 
    t2.join ();
    // t3.join () 오류! 
    t4.join (); 
}

대부분의 경우 우리가 사용하는 방법은 위의 두 번째 스레드를 만드는 것입니다. 가입 및 분리 상기 다음 모양.

4.2 가입 && 분리

스레드 작성의 경우, 일반적으로는 가입하고 파괴하기 전에 기능을 분리 호출;

이 호출 스레드 상태가 매우 중요하다뿐만 아니라 이전과 이후,이 두 기능의 타이밍과 의미를 알아 내기 위해 호출합니다.

  • 타겟 스레드가 완료 될 때까지 차단 현재 스레드 가입;
    • 활성 스레드에 의해 결합 가능한 수 () 함수 검사 조인 호출 할 수있다;
    • () == 결합 가능한 사실은 현재 스레드 활성 스레드는 함수 호출에 참여할 수 있음을 나타낸다;
    • 기본 생성자는 객체가 거짓 () == 조인이다 생성;
    • 거짓이 될 것이다 조인, 그것은 스레드가 완료되었음을 나타냅니다 후 한 번만 호출에 가입;
    • 전화 ternimate () 스레드 == false)를 (조인해야합니다;
    • 스레드가 완료 활동이 조인하는 스레드 경우에도 () 함수에 가입 호출하지 않는 경우 () == true의 경우, 당신은 여전히 ​​조인 () 함수를 호출 할 수 있습니다;
  • 스레드 개체를 분리하고, 분리 실에 의해 표현;
    • 분리 호출 객체는 스레드를 표현하고 완전한 분리를 나타내는 스레드;
    • 스레드의 분리가 제한과 규제를받지 후에는 완성 된 릴리스 자원까지, 데몬 스레드로 볼 수있다, 혼자 수행합니다;
    • 분리 스레드가 어떤 스레드를 나타냅니다 더 이상 객체 후,
    • 후 분리 조인 () == 거짓, 심지어 아직 실행하는 경우;

사례 연구에 가입 :

INT ) (주 { 
    스레드 t (값 TStart, " C ++ 스레드 11! " ); 
    COUT << t.joinable () << ENDL;
    경우 (t.joinable ()) t.join ();
    // t.detach (); 오류 
    COUT << t.joinable () << ENDL;
    // t.join (); 오류 
    cout과 << " 주요 기능! " << endl의; 
    시스템 ( " 정지 " ); 
}

그들이 가입 호출하기 전에 간단히 유일한 스레드가 호출이 반환 스레드가 완료되었음을 나타냅니다, 활성, 조인 () == false입니다.

인라인 무효 실 :) (가입 
    {     // 스레드에 가입 
    하는 경우 (! 조인 ()) 
        _Throw_Cpp_error (_INVALID_ARGUMENT); 
    CONST의  불리언 _Is_null = _Thr_is_null (_Thr);    // 연타 -Wparentheses 평등을 피 
    ... 
}

위의 t.join은 () t.detach를 교체 ()와 같은 결과를 얻을 수 있습니다.

무효 분리 () 
    {    // 스레드를 분리 
    하는 경우 (! 조인 ()) 
        _Throw_Cpp_error (_INVALID_ARGUMENT); 
    _Thrd_detachX (_Thr); 
    _Thr_set_null (_Thr); 
    }

(가) 위의 분리 파일에 정의 된 스레드, 우리는 활성 스레드가 분리를 호출 할 수 있습니다 만 조인 == 진정한 스레드 ()을 볼 수 있습니다.

~ 스레드 () _NOEXCEPT는 
    {    // 정리 
    하면 (조인 ()) 
        _XSTD 종료 (); 
    }

스레드가 둘에 가입하지 않고 전화를 분리 호출하면 스레드가 종료 스레드 객체가 파괴 될 때 조인 () == true로, 그것이 종료 호출합니다 ().

4.3 스레드 ID를 얻을 수

스레드는 스레드 식별자의 ID는, C ++ 표준은 두 가지 모드는 스레드 ID를 획득 제공이고;

  1. thread_obj.get_id ();
  2. 표준 : this_thread :: get_id ()

주의 할 점은, 즉, 0의 값을 반환 get_id 어떤 스레드 스레드 OBJ 호출을 나타내지 않는 빈 스레드 객체이다;

또한, 경우에 스레드 또는 조인 () == false를 get_id 호출이 리턴 결과 0을 분리.

COUT << t.get_id () << '  ' << this_thread :: get_id () << ENDL;
// t.detach (); 
t.join (); 
COUT << t.get_id () << '  ' << 표준 : this_thread :: get_id () << ENDL;

4.4 교환 스레드 스레드 표현

또한 위에서 설명한 스레드가 스레드 객체에 의해 격리 및 표현 될 수 분리, 또는 다른 스레드로 이동, 당신은 또한 두 개의 스레드로 표현 교환 스왑 스레드 개체에 사용할 수있다.

두 개의 스레드를 살펴 교환의 예.

INT의 값 TStart ( CONST  문자열TNAME) { 
    COUT << " 스레드 테스트! " << TNAME << ENDL;
    반환  0 ; 
} 

INT 의 main () { 
    스레드 T1 (값 TStart, " C ++ 11 thread_1! " ); 
    스레드 T2 (값 TStart, " C ++ 11 thread_2! " ); 
    COUT << " 현재 스레드 ID : " << this_thread :: get_id () << ENDL; 
    cout과 << " 스왑 전에 :thread_1 ID : " << t1.get_id () << " thread_2 ID : " << t2.get_id () << ENDL; 
    t1.swap (T2) 
    COUT << " 스왑 후 : " << " thread_1 ID : " << t1.get_id () << " thread_2 ID : " << t2.get_id () << ENDL;
     // t.detach (); 
    t1.join (); 
    t2.join (); 
}

결과 :

스레드 테스트! C ++ 11 thread_1! 
스레드 테스트 ! C ++ 11 thread_2! 
현재 스레드 ID : 39308 
스왑 전에 : thread_1 ID : 26240 thread_2 ID : 37276 
스왑 후 : thread_1 ID : 37276 thread_2 ID : 26240

여기 스레드 :: 스왑 기능입니다.

보이드 스왑 (스레드 및 _Other) _NOEXCEPT 
    {    // _Other와 스왑 
    _STD 스왑 (_Thr, _Other._Thr); 
    }

우리는 기본 스레드 오브젝트 핸들에 의해 유지되는 스왑의 교환 과정을 볼 수 있습니다;

소개 C ++ 여기에 새로운 표준 스레드에 대한 기본적인 소개를 멀티 스레딩, 그리고 만난 단순이 있어야 것을 알 수있다.

무료 쓰기 기사 뒤에 스레드의 안전과 다른 고위 관리 주제에 대해 설명합니다.

추천

출처www.cnblogs.com/yssjun/p/11533346.html