스 레 드 끝 자원 방출

스 레 드 를 만 들 때 시스템 은 스 레 드 에 자원 을 분배 합 니 다. 우리 가 볼 수 있 는 것 은 스 레 드 설명자, 스 레 드 스 택 입 니 다. 시스템 내부 에서 더욱 복잡 한 시스템 유지 정보 가 있 습 니 다. 스 레 드 를 만 들 때 커 널 은 항상 자원 을 유지 합 니 다. 비교적 이상 적 인 상황 은 스 레 드 운행 이 끝 난 후에 시스템 자원 과 프로 세 스 자원 을 방출 하 는 것 입 니 다.스 레 드 반환 값 이 사용 하 는 메모리, 스 레 드 스 택, 레지스터 상태 등 을 포함 하여 후발 주자 의 사용 에 대비 합 니 다.
스 레 드 실행 이 끝 난 후 자원 을 방출 하 는 세 가지 방법: 
이러한 방법 을 이용 하여 우 리 는 스 레 드 가 종료 되 었 을 때 시스템 자원 이 방출 되 지 않 는 상황 을 피 할 수 있 습 니 다.
pthread_join, 이 함수 의 원형 은 pthread 입 니 다.join (pthread t thread, void * * value ptr) 은 호출 함수 의 스 레 드 를 막 고 지정 한 스 레 드 가 종료 되 기 를 기다 리 는 역할 을 합 니 다.스 레 드 만 접속 가능 할 때 pthread 호출join 이 야 말로 성공 할 수 있다
pthread_detach, 이 함 수 는 스 레 드 의 접속 가능 속성 을 바 꾸 어 분리 모드 로 바 꿀 수 있 습 니 다.스 레 드 가 분리 모드 에 있 을 때 우 리 는 스 레 드 의 반환 값 에 관심 이 없다 는 것 을 나타 낸다. 작업 스 레 드 가 실 행 된 후에 스스로 탈퇴 하고 커 널 은 이 스 레 드 가 차지 하 는 자원 을 방출 할 것 이다
스 레 드 속성 구조 pthread 설정attr_t 는 pthread 와 같이 분리 가능 합 니 다.attr_init(&attr);pthread_attr_setdetach (& attr, PTHREAD CREATE DETACHED), 이 스 레 드 속성 대상 으로 pthread 참여create 함수 에서 이렇게 만 든 스 레 드 는 모두 분 리 됩 니 다
다음은 분리 스 레 드 를 사용 하 는 의미 입 니 다.
식별 누설
    연결 가능 한 스 레 드 를 만 들 지만 연결 을 잊 어 버 리 면 자원 이나 개인 메모리 가 프로 세 스 공간 에 저장 되 어 재 활용 되 지 않 습 니 다.연결 가능 한 스 레 드 를 연결 해 야 합 니 다.그렇지 않 으 면 심각 한 메모리 누 출 문 제 를 일 으 킬 수 있다.
    예 를 들 어 Red Hat Enterprise Linux (RHEL 4) 의 한 스 레 드 에 10MB 스 택 이 필요 하 다 는 것 은 연결 하지 않 으 면 최소 10MB 의 메모리 가 유출 된다 는 뜻 이다.관리자 - 작업 스 레 드 모드 프로그램 을 설계 하여 들 어 오 는 요청 을 처리 합 니 다.그 다음 에 점점 더 많은 작업 스 레 드 를 만들어 서 각 작업 을 수행 하고 마지막 으로 이 스 레 드 를 중지 해 야 합 니 다.연결 가능 한 스 레 드 이 고 호출 되 지 않 았 다 면  pthread_join()  연결 하면 스 레 드 가 종 료 된 후에 발생 하 는 스 레 드 마다 대량의 메모리 가 누 출 됩 니 다 (적어도 스 택 마다 10MB).생 성 되 고 연결 되 지 않 은 상태 에서 종료 되 는 작업 스 레 드 가 많아 지면 서 누 출 된 메모리 도 계속 증가 하고 있다.또한 프로 세 스 는 새 스 레 드 를 만 들 수 있 는 메모리 가 없 기 때문에 새 스 레 드 를 만 들 수 없습니다.
목록 1 은 연결 가능 한 스 레 드 를 잊 어 버 렸 을 때 발생 하 는 심각 한 메모리 누 출 을 보 여 줍 니 다.이 코드 를 사용 하여 프로 세 스 공간 에서 공존 할 수 있 는 스 레 드 의 최대 크기 를 검사 할 수 있 습 니 다.
[cpp]  view plain copy
#include  
#include  
void run() {  
   pthread_exit(0);  
}  
  
int main () {  
   pthread_t thread;  
   int rc;  
   long count = 0;  
   while(1) {  
      if(rc = pthread_create(&thread, 0, run, 0) ) {  
         printf("ERROR, rc is %d, so far %ld threads created", rc, count);  
         perror("Fail:");  
         return -1;  
      }  
      count++;  
   }  
   return 0;  
}  
목록 1 에서 호출 됨  pthread_create()  기본 스 레 드 속성 을 포함 하 는 새 스 레 드 를 만 듭 니 다. 기본 적 인 상황 에서 새로 만 든 스 레 드 는 연결 이 가능 합 니 다. 고장 이 날 때 까지 연결 가능 한 스 레 드 를 계속 만 듭 니 다. 그리고 오류 코드 와 고장 원인 을 출력 합 니 다.
다음 명령 을 사용 하여 Red Hat Enterprise Linux Server 5.4 에서 목록 1 의 코드 를 컴 파일 할 때:  [root@server ~]# cc -lpthread thread.c -o thread 목록 2 에서 보 여 준 결 과 를 얻 을 수 있 습 니 다.
목록 2. 메모리 누 출 결과[root@server ~]# ./thread
ERROR, rc is 12, so far 304 threads created
Fail:: Cannot allocate memory

코드 가 304 개의 스 레 드 를 만 든 후에 더 많은 스 레 드 를 만 들 수 없습니다. 오류 코드 는?  12 더 이상 메모리 가 사용 되 지 않 음 을 나타 낸다.
    목록 1 과 목록 2 에서 보 듯 이 연결 가능 한 스 레 드 가 생 성 되 었 지만 연결 되 지 않 았 기 때문에 종 료 된 연결 가능 한 스 레 드 마다 프로 세 스 공간 을 차지 하고 프로 세 스 메모리 가 누 출 됩 니 다.
    RHEL 의 POSIX 스 레 드 는 10MB 크기 의 개인 스 택 을 가지 고 있 습 니 다. 다시 말 하면 시스템 은 pthread 마다 최소 10MB 의 전용 저장 소 를 할당 합 니 다. 예제 에서 304 개의 스 레 드 는 프로 세 스 가 중단 되 기 전에 만 들 어 졌 습 니 다. 이 스 레 드 는 304 * 10MB 메모 리 를 사용 하여 약 3GB 를 차지 합 니 다. 한 프로 세 스 의 가상 메모리 크기 는 4GB 이 며, 그 중 4 분 의 1 의 프로 세 스 공간 입 니 다.리 눅 스 커 널 을 위 한 것 입 니 다. 이렇게 되면 3GB 의 메모리 공간 이 사용자 공간 으로 사용 할 수 있 습 니 다. 따라서 3GB 의 메모리 가 죽은 스 레 드 로 소 모 됩 니 다. 이것 은 심각 한 메모리 누 출 입 니 다. 또한 발생 속도 가 왜 이렇게 빠 른 지 쉽게 이해 할 수 있 습 니 다.
    누설 을 복구 하려 면 코드 호출 을 추가 할 수 있 습 니 다.  pthread_join() 이 방법 은 모든 연결 가능 한 스 레 드 를 연결 할 수 있다.
스 레 드 종료 방법:
[cpp]  view plain copy
1) 메 인 스 레 드 는 하위 스 레 드 가 끝 날 때 까지 기 다 립 니 다.  
    pthread join 함 수 를 사용 할 수 있 습 니 다. pthread join () 함 수 는 지정 한 스 레 드 의 끝 을 기다 리 고 있 습 니 다. 즉, 메 인 스 레 드 는 하위 스 레 드 로 막 힐 것 입 니 다. 하위 스 레 드 가 실행 되 지 않 으 면 메 인 스 레 드 는 영원히 phread join () 아래 프로그램 을 실행 하지 않 습 니 다. 프로그램 은 다음 과 같 습 니 다.  
     
#include   
#include   
void pthread_1()  
{  
 printf("I am the child!!");  
   
 sleep(2);  
   
 printf("I am exit!!");  
   
}  
void main()  
{  
 pthread_t tid;  
 void *tret;  
   
 pthread_create(&tid, NULL, &pthread_1, NULL);  
 pthread_join(tid, &tret);  
 printf("Thread exit with code %d", (int)tret);  
 exit(0);  
}     
2) 메 인 스 레 드 종료 서브 스 레 드  
posix   thread 에서 스 레 드 는 두 개의 취소 상태 가 있 습 니 다: 즉시 취소 와 지연 취소   
즉시 취소 하면 pthread cancel 입 니 다. 스 레 드 가 무엇 을 하 는 지 관리 하지 않 고 바로 이 스 레 드 를 종료 합 니 다.   
지연 취 소 는 pthread cancel 이후 에 스 레 드 가 계속 실 행 됩 니 다. 취소 점 함수 "   
시스템 은 기본적으로 지연 취소 입 니 다.  
스 레 드 를 끝 내 려 면 몇 가지 방법 이 있 습 니 다.   
a. 스 레 드 를 즉시 취소 로 설정 합 니 다.   
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,   NULL);    
절 차 는 다음 과 같다.  
#include   
#include   
#include   
#include   
void pthead_1()  
{  
 pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,   NULL);     
   
 while(1)  
 {  
  printf("I am the child ");   
  usleep(10000);  
 }   
   
}  
void main()  
{  
 pthread_t pthread_id;  
   
 pthread_create(&pthread_id, NULL, &pthead_1, NULL);  
   
 sleep(2);  
   
 pthread_cancel(pthread_id);  
   
 printf("I make the child exit!!");  
 pthread_exit(0);  
   
}  
  
b. 스 레 드 에 취소 점 함수 호출 을 추가 합 니 다.   
while(   1   )   
{   
/ / sleep (1) 또는 pthread testcancle ();   
}  

  • 좋은 웹페이지 즐겨찾기