우 육시 엉 - 태어난 자연 C ++ 언어 연구 노트 : C ++ 멀티 스레딩

멀티 스레딩은 멀티 태스킹, 멀티 태스킹의 전문 형태의 컴퓨터 실행 두 개 이상의 프로그램을 할 수있다. 일반적으로, 멀티 태스킹의 두 가지 유형이 : 프로세스 기반 및 스레드 기반.
프로세스 기반의 멀티 태스킹은 프로그램의 동시 실행이다.
멀티 태스크에 기초하여 처리 스레드가 동시에 동일한 프로그램 조각 실행된다.
프로그램을 동시에 실행할 수있는 두 개 이상의 부품이 포함되어 멀티 스레드. 이러한 프로그램의 각 부분은 각각 하나의 실행 경로를 정의 스레드 불린다.
는 POSIX 스레드를 만들기 :
사용법 #include <pthread.h를>
는 pthread_create (스레드, ATTR, start_routine, ARG) 
여기에서는 pthread_create는 새로운 스레드를 생성하고 실행합니다. 다음은 매개 변수에 대한 설명입니다 :
스레드 식별자를 가리키는 스레드 포인터.
불투명 오브젝트 속성 ATTR, 속성은 스레드를 설정하는데 사용될 수있다. 당신은 당신은 또한 기본 값이 NULL 사용할 수 있습니다, 스레드가 개체 속성을 지정할 수 있습니다.
스레드가 생성되면 함수 시작 주소를 실행 start_routine 스레드, 그것은 실행됩니다.
매개 변수는 실행 기능을 arg를. 그것은 포인터 캐스트로 통합해야 무효 배달 유형. 당신은 매개 변수를 사용하여 NULL을 통과하지 마십시오.
성공적으로 스레드를 생성 할 때, 함수는 반환 0을 반환 값이없는 경우, 0 스레드를 만들 수있는 실패 후.
는 POSIX 스레드의 종료 :
사용법 #include <pthread.h를>
가 pthread_exit (상태) 
여기가 pthread_exit 명시 적으로 스레드를 종료하는 데 사용됩니다. 스레드의 완료 후 작업을 계속 할 필요가없는 경우 일반적으로는 pthread_exit () 함수가 호출됩니다.
) (주이가 pthread_exit을 통해 출구가 끝나기 전에 생성하고, 그 스레드가 () 인 경우, 다른 스레드가 계속 실행됩니다. 그렇지 않으면 것이다 ()는 자동으로 메인의 말에 종료된다.
다음의 간단한 예는 pthread_create 코드를 () 함수를 사용 작성 5 개 각 스레드 출력 스레드 " 헬로 Runoob을! " :
사용법 #include <iostream>
 // 필요한 헤더 파일
사용법 #include <pthread.h를>
 
사용하는  네임 스페이스 표준을;
 
#DEFINE NUM_THREADS 5
 
// 실행 스레드 함수 
무효 * say_hello ( 무효 *의 인수)
{
    cout과 << " 안녕하세요 Runoob! " << endl의;
    반환  0 ;
}
 
int 형 ) (주
{
    // 스레드 정의 변수, 배열 변수의 다수의 ID 
    TIDS [NUM_THREADS]가 pthread_t;
      ( INT I = 0 ; I <NUM_THREADS; ++ I)
    {
        // 파라미터는 : 쓰레드 ID 생성 스레드 파라미터, 함수 호출 전달 인자 
        INT RET는 pthread_create = ( TIDS [I], NULL, say_hello, NULL);
         IF (! RET = 0 )
        {
           COUT << " 는 pthread_create 오류 : ERROR_CODE = " << RET << ENDL;
        }
    }
    // 공정 종료 전에 각 스레드가 종료 등이, 그렇지 않으면 처리는 강제적으로 종료 된 후, 스레드는 반응하지 않을 수 
    는 pthread_exit (NULL);
}
사용 - 프로그램은 다음 라이브러리를 컴파일 lpthread :

G $ ++ Test.cpp에 -lpthread -o test.o
다음의 간단한 예 코드의 용도는 pthread_create () 함수를 작성 5 개 스레드, 및 수신 파라미터를 수신한다. 각 스레드는 인쇄 " 여보세요 Runoob을! " 메시지가 수신 된 매개 변수를 출력 한 다음 전화가 pthread_exit ()는 스레드를 종료 할 수 있습니다.
사용법 #include <iostream> 
#INCLUDE <cstdlib> 
#INCLUDE <pthread.h를>
 
사용하는  네임 스페이스 표준을;
 
#DEFINE NUM_THREADS 5
 
보이드 * PrintHello ( 무효 *가 threadid)
{  
   // 수신 파라미터 포인터가 아닌 정수 포인터 입력되고, 주조 후 판독 
   INT의 TID * = (( INT * ) ThreadID);
   cout과 << " ! 안녕하세요 Runoob线程ID, " << TID << endl의;
   가 pthread_exit (NULL);
}
 
int 형 ) (주
{
   스레드가 pthread_t [NUM_THREADS];
   INT 인덱스 [이 NUM_THREADS]; // 난의 배열의 값을 보유 
   int로 RC를,
    INT 나;
    위한 은 (i = 0 ; I <NUM_THREADS; I ++ ) {      
      COUT << " 주요 () 스레드를 만들고 " << I << ENDL;
      [i]는 인덱스 = 1; //는 제 i의 값을 유지하도록
       // 무효 *을 형식으로 캐스팅해야 수신 시간, 즉 지정되지 않은 포인터         
      (= RC는 pthread_create를 스레드 [I], NULL,
                          PrintHello ( 무효 *) (인덱스 [I]));
      경우 (RC) {
         cout과 << " 오류 : 스레드를 만들 수 없습니다, " << RC << endl의;
         출구 ( - 1 );
      }
   }
   가 pthread_exit (NULL);
}
그것이 가리키는 때문에, 데이터 콜백 스레드의 모든 유형을 전달할 수 있습니다 무효 의 예 다음과 같이 :
사용법 #include <iostream> 
#INCLUDE <cstdlib> 
#INCLUDE <pthread.h를>
 
사용하는  네임 스페이스 표준을;
 
#DEFINE NUM_THREADS 5
 
구조체 thread_data {
    INT는   thread_id;
   문자 * 메시지;
};
 
보이드 * PrintHello ( 무효 *의 threadarg)
{
   구조체 thread_data * my_data 단계;
 
   my_data = ( 구조체 thread_data * ) threadarg;
 
   COUT << " 스레드 ID : " << my_data-> thread_id;
   COUT << " 메시지 : " << my_data-> << 메시지 ENDL;
 
   가 pthread_exit (NULL);
}
 
int 형 ) (주
{
   스레드가 pthread_t [NUM_THREADS];
   구조체 thread_data TD [NUM_THREADS]을;
   INT RC;
   int로 난을;
 
    (ⅰ = 0 ; I <NUM_THREADS 단계; I ++ ) {
      COUT << " 메인 () 생성 실, " << I << ENDL;
      TD [I] .thread_id = I;
      TD [I] .message = (  *) " 이 메시지 인 " ;
      RC =는 pthread_create ( 스레드 [I], NULL,
                          PrintHello ( 무효 *) 및 TD [I]);
      경우 (RC) {
         cout과 << " 오류 : 스레드를 만들 수 없습니다, " << RC << endl의;
         출구 ( - 1 );
      }
   }
   가 pthread_exit (NULL);
}
연결 또는 분리 된 스레드가 두 가지 기능을 다음과 같은 수 있습니다 :
pthread_join을 (threadid, 상태) 
pthread_detach (threadid) 
pthread_join을 () 서브 루틴을 방해 호출 프로그램은 지정된 threadid 스레드가 종료 될 때까지. 스레드가 생성 될 때, 그것은 (조인) 또는 (단독) 착탈 연결되어 있는지 여부의 속성을 정의이다. 연결할 수 있습니다 연결할 수 있습니다 스레드를 만들에만 정의했다. 생성되는 스레드가 분리로 정의되면,이 연결되지 않을 수 있습니다.
사용법 #include <iostream> 
#INCLUDE <cstdlib> 
#INCLUDE <pthread.h를> 
사용법 #include <unistd.h>
 
사용하는  네임 스페이스 표준을;
 
#DEFINE NUM_THREADS 5
 
보이드 * 대기 ( 무효 *의 t)
{
   int로 난을;
   TID;
 
   TID = ( 길이 ) t;
 
   슬립 ( 1 );
   COUT << " 스레드 자 " << ENDL;
   COUT << " ID가 스레드 : " << TID는 << "   ... 종료 " << ENDL 단계;
   가 pthread_exit (NULL);
}
 
int 형 ) (주
{
   INT RC;
   int로 난을;
   스레드가 pthread_t [NUM_THREADS];
   pthread_attr_t의 ATTR;
   보이드 * 상태;
 
   // 초기화되고 연결되는 나사 세트 (결합 가능한) 
   pthread_attr_init ( ATTR);
   pthread_attr_setdetachstate ( & ATTR, PTHREAD_CREATE_JOINABLE);
 
    (ⅰ = 0 ; I <NUM_THREADS 단계; I ++ ) {
      COUT << " 메인 () 생성 실, " << I << ENDL;
      RC =는 pthread_create (스레드 [I], NULL, 대기 ( 무효 *) 및 I);
      경우 (RC) {
         cout과 << " 오류 : 스레드를 만들 수 없습니다, " << RC << endl의;
         출구 ( - 1 );
      }
   }
 
   // 속성을 삭제하고 다른 스레드의 대기 
   pthread_attr_destroy ( ATTR)
    에 대한 (나는 = 0 ; 나는 <NUM_THREADS, 나는 ++ ) {
      RC = pthread_join을 (스레드 [I], STATUS);
      경우 (RC) {
         COUT은 << " 오류없는이 가입 " << RC << endl의를;
         출구 ( - 1 );
      }
      COUT << " 주요 : 쓰레드 ID 완료 : " << I;
      COUT은 << "   상태로 종료 : " << 상태 << ENDL 단계;
   }
 
   cout과 << " 홈페이지 : 프로그램 종료. " << endl의;
   가 pthread_exit (NULL);
}

 

추천

출처www.cnblogs.com/tszr/p/12150118.html