스 레 드 끝 자원 방출
스 레 드 실행 이 끝 난 후 자원 을 방출 하 는 세 가지 방법:
이러한 방법 을 이용 하여 우 리 는 스 레 드 가 종료 되 었 을 때 시스템 자원 이 방출 되 지 않 는 상황 을 피 할 수 있 습 니 다.
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 ();
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
SQL JOINS 조인● LEFT JOIN A-B ● RIGHT JOIN B-A ● OUTER JOIN A∪B A∪B-(A∩B): A∪B에서 A, B의 기본키 부분을 뺌 ● SELF JOIN A∩B...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.