1. 스레드의 개념
스레드는 프로세스 내의 기본 실행 흐름이자 시스템 스케줄링의 개체입니다. 프로세스는 배타적이며 스레드는 공유됩니다. 각 스레드는 프로세스의 파일 설명자, 신호 처리 방법, 현재 작업 디렉터리, 사용자 ID(uid) 및 그룹 ID(gid)를 공유합니다. 그러나 스레드 ID, 스택 공간, 컨텍스트(다양한 레지스터의 값, 프로그램 카운터 및 스택 포인터 포함), 공간, 신호 마스크 워드 및 스케줄링 우선순위와 같은 일부 리소스는 스레드 전용입니다. 프로세스가 가족인 것처럼 스레드는 가족의 구성원입니다. 각 가족 구성원은 공용 공간(식당, 거실)을 갖습니다. 물론, 가족 구성원 각자에게도 자신만의 사적인 공간이 있습니다.
2. 스레드 제어
스레드 생성 및 종료
스레드를 생성하려면 pthread_create() 함수를 사용합니다. 성공하면 0을 반환하고 실패하면 오류 번호를 반환합니다. pthread_create()를 호출하여 새 스레드를 생성한 후. 현재 스레드는 pthread_create()에서 반환되어 실행을 계속합니다. 새 스레드에 의해 실행되는 코드는 함수 포인터 start_routine에 의해 결정됩니다. start_routine 함수는 pthread_create()의 인수를 통해 전달되는 매개변수를 받습니다. 유형은 void*이고 start_tooutine의 반환 값 유형도 void*입니다. start_tooutine이 반환된 후 이 스레드가 종료되고 다른 스레드는 pthread_join()을 호출하여 start_tooutine의 반환 값을 가져올 수 있습니다. start_tooutine 함수는 ① return(void*), ② pthread_exit(void*), ③ pthread_cancel(pthread_self())에 의해 종료될 수 있습니다.
다음과 같이 볼 수 있습니다.
1. 반품을 통해 반품된 경우. pthread_join이 받은 값은 스레드
의 반환값이다. 2. 다른 스레드가 pthread_cancel을 호출하여 스레드가 비정상적으로 종료된 경우. 3. pthread_exit를 호출하여 종료한 경우
오류 코드가 반환됩니다. pthread_join은 pthread_exit에 전달된 매개변수를 저장합니다.
4. 두 스레드의 스레드 번호가 다릅니다
3. 스레드 분리
언제든지 스레드. 결합 가능하거나 분리 가능합니다. 조인 가능한 스레드는 다른 스레드에 의해 회수되고 종료될 수 있습니다. 해당 메모리 리소스는 다른 스레드에 의해 재활용되기 전에 해제되지 않습니다. 분리 가능한 스레드는 다른 스레드에 의해 재활용되거나 종료될 수 없으며 해당 스레드의 메모리 리소스는 종료 시 시스템에 의해 자동으로 해제됩니다. 기본적으로. 스레드는 연관되도록 생성됩니다. 메모리 누수를 방지하려면 pthread_join을 호출하여 각 조인 가능한 스레드를 명시적으로 회수하거나 pthread_detach 함수를 통해 분리해야 합니다.
결합 가능한 스레드가 종료되었지만 pthread_joined가 아닌 경우 해당 프로세스의 상태는 좀비 프로세스와 유사합니다. 즉, 일부 리소스가 재활용되지 않았으므로 스레드 생성자는 pthread_join을 호출하여 스레드가 끝날 때까지 기다려야 합니다. 그리고 스레드의 종료 코드를 가져와 해당 리소스를 재활용할 수 있습니다. pthread_join을 호출한 후 스레드가 종료되지 않으면 호출자가 차단됩니다. 이는 pthread_detach(pthread_self()) 코드를 하위 스레드 또는 pthread_detach(thread_id)를 호출하는 상위 스레드에 추가하여 비차단하고 즉시 반환함으로써 수행할 수 있습니다. 이렇게 하면 하위 스레드의 상태가 분리됨으로 설정되어 스레드 실행이 완료되면 모든 리소스가 자동으로 해제됩니다.
#include<stdio.h> 2 #include<pthread.h> 3 void * thread_run(void* arg) 4 { 5 int count=5; 6 while(1) 7 { 8 printf("this is a thread,thread id is\n"pthread_self()); 9 sleep(1); 10 } 11 //return (void*)1; 12 //pthread_exit((void*)2); 13 // pthread_cancel(pthread_self()); 14 } 15 int main() 16 { 17 pthread_t id; 18 int ret=pthread_create(&id,NULL,thread_run,NULL); 19 int count=10; 20 while(count-->0) 21 { 22 printf("this is a main thread,thread id is %u\n",pthread_self()); 23 sleep(1); 24 } 25 void * ted=0; 26 pthread_cancel(id); 27 pthread_join(id,&ted); 28 printf("return success %d\n",(int)ted); 29 }
자식 스레드에서 pthread_detach(pthread_self())를 주석 처리하면 결과는 다음과 같습니다. 하위 스레드를 분리한 후 다른 스레드가 하위 스레드 프로세스를 결합하고 종료한 다음 메모리 리소스를 해제합니다. 위의 내용은 자식 프로세스에서 분리되어 다른 스레드가 더 이상 접근할 수 없기 때문입니다. 스레드-->자식 스레드의 세 가지 종료 방법-->다른 스레드가 스레드에 참여합니다. 종료 방법에 따라 Join의 반환 값이 달라집니다. 스레드 분리를 위해 하위 스레드에 pthread_detach()를 추가하면 해당 하위 스레드가 분리 가능한 스레드로 설정되어 메모리 누수 없이 메모리 자원이 자동으로 해제됩니다. 설정하지 않은 경우 Join을 사용하여 수신을 표시한 다음 리소스를 해제해야 메모리 누수가 발생하지 않습니다.
위 내용은 Linux-thread 제어 및 분리 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(m.sbmmt.com)를 참고해주세요!