멀티 스레딩은 멀티 태스킹, 멀티 태스킹의 전문 형태의 컴퓨터 실행 두 개 이상의 프로그램을 할 수있다. 일반적으로, 멀티 태스킹의 두 가지 유형이 : 프로세스 기반 및 스레드 기반. 프로세스 기반의 멀티 태스킹은 프로그램의 동시 실행이다. 멀티 태스크에 기초하여 처리 스레드가 동시에 동일한 프로그램 조각 실행된다. 프로그램을 동시에 실행할 수있는 두 개 이상의 부품이 포함되어 멀티 스레드. 이러한 프로그램의 각 부분은 각각 하나의 실행 경로를 정의 스레드 불린다. 는 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); }