>  기사  >  백엔드 개발  >  Linux--스레드 제어 및 분리

Linux--스레드 제어 및 분리

黄舟
黄舟원래의
2017-01-18 10:34:451522검색

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())에 의해 종료될 수 있습니다.

rree

Linux--스레드 제어 및 분리

다음과 같이 볼 수 있습니다.
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 }

Linux--스레드 제어 및 분리

자식 스레드에서 pthread_detach(pthread_self())를 주석 처리하면 결과는 다음과 같습니다. 하위 스레드를 분리한 후 다른 스레드가 하위 스레드 프로세스를 결합하고 종료한 다음 메모리 리소스를 해제합니다. 위의 내용은 자식 프로세스에서 분리되어 다른 스레드가 더 이상 접근할 수 없기 때문입니다. 스레드-->자식 스레드의 세 가지 종료 방법-->다른 스레드가 스레드에 참여합니다. 종료 방법에 따라 Join의 반환 값이 달라집니다. 스레드 분리를 위해 하위 스레드에 pthread_detach()를 추가하면 해당 하위 스레드가 분리 가능한 스레드로 설정되어 메모리 누수 없이 메모리 자원이 자동으로 해제됩니다. 설정하지 않은 경우 Join을 사용하여 수신을 표시한 다음 리소스를 해제해야 메모리 누수가 발생하지 않습니다.

위 내용은 Linux-thread 제어 및 분리 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요! Linux--스레드 제어 및 분리


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.