c + + Pthread 스 레 드 를 만 든 후 join 또는 detach 를 사용 하여 스 레 드 자원 을 방출 해 야 합 니 다.
4299 단어 pthread
이틀 동안 Pthread 자 료 를 볼 때 본의 아니 게 이러 하 다 한 마디 (man pthread detach) 를 보 았 습 니 다.
Either pthread_join(3) or pthread_detach() should be called for each thread
that an application creates, so that system resources for the thread can be
released. (But note that the resources of all threads are freed when the
process terminates.)
즉, 모든 프로 세 스 가 생 성 된 후에 pthread 를 호출 해 야 합 니 다.join 또는 pthreaddetach 함수, 이렇게 스 레 드 가 끝 날 때 만 자원 (스 레 드 설명 정보 와 stack) 이 풀 릴 수 있 습 니 다.
그 후에 다시 조사 했다 pthread_join 하지만 pthread 를 호출 해 야 한 다 는 명확 한 설명 은 없습니다.join 또는 pthreaddetach.
근 데 Pthread for win 32 를 다시 찾 아 봤 어 요. pthread_join
When a joinable thread terminates, its memory resources (thread descriptor and stack) are not deallocated until another thread performs pthread_join on it. Therefore, pthread_join must be called once for each joinable thread created to avoid memory leaks.
새 스 레 드 에서 pthread 를 호출 하지 않 았 다 면join 또는 pthreaddetach 는 메모리 누 출 을 초래 할 수 있 습 니 다. 만 든 스 레 드 가 많 을 수록 메모리 이 용 률 이 높 아 집 니 다. 더 이상 스 레 드 를 만 들 수 없 을 때 까지 프로 세 스 를 끝 낼 수 밖 에 없습니다.
해결 방법 은 세 가지 가 있다.
1. 스 레 드 호출
pthread_detach(pthread_self()) 이 방법 이 제일 쉬 워 요.
2
. 스 레 드 를 만 드 는 설정 PTHREADCREATE_DETACHED 속성
3. 스 레 드 생 성 후 사용 pthread_join() 하위 스 레 드 가 끝 날 때 까지 기 다 렸 습 니 다.
다음은 몇 가지 간단 한 예 이다.
1. 호출
pthread_detach(pthread_self())
#include
#include
#include
void *PrintHello(void)
{
pthread_detach(pthread_self());
int stack[1024 * 20] = {0,};
//sleep(1);
long tid = 0;
//printf(“Hello World! It’s me, thread #%ld!”, tid);
//pthread_exit(NULL);
}
int main (int argc, char *argv[])
{
pthread_t pid;
int rc;
long t;
while (1) {
printf(“In main: creating thread %ld”, t);
rc = pthread_create(&pid, NULL, PrintHello, NULL);
if (rc){
printf(“ERROR; return code from pthread_create() is %d”, rc);
//exit(-1);
}
sleep(1);
}
printf(” — main End —- ”);
pthread_exit(NULL);
}
2
. 스 레 드 를 만 드 는 설정 PTHREADCREATE_DETACHED 속성
#include
#include
#include
void *PrintHello(void)
{
int stack[1024 * 20] = {0,};
//pthread_exit(NULL);
//pthread_detach(pthread_self());
}
int main (int argc, char *argv[])
{
pthread_t pid;
int rc;
long t;
while (1) {
printf(“In main: creating thread %ld”, t);
pthread_attr_t attr;
pthread_t thread;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
rc = pthread_create(&pid, &attr, PrintHello, NULL);
pthread_attr_destroy (&attr);
if (rc){
printf(“ERROR; return code from pthread_create() is %d”, rc);
//exit(-1);
}
sleep(1);
}
printf(” — main End —- ”);
pthread_exit(NULL);
}
3. 스 레 드 생 성 후 사용 pthread_join () 은 하위 스 레 드 가 끝 날 때 까지 기 다 렸 습 니 다.
#include
#include
#include
void *PrintHello(void)
{
int stack[1024 * 20] = {0,};
//sleep(1);
long tid = 0;
//pthread_exit(NULL);
//pthread_detach(pthread_self());
}
int main (int argc, char *argv[])
{
pthread_t pid;
int rc;
long t;
while (1) {
printf(“In main: creating thread %ld”, t);
rc = pthread_create(&pid, NULL, PrintHello, NULL);
if (rc){
printf(“ERROR; return code from pthread_create() is %d”, rc);
//exit(-1);
}
pthread_join(pid, NULL);
sleep(1);
}
printf(” — main End —- ”);
pthread_exit(NULL);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
메모리 할당 오류최근에 아주 재미있는 버그를 만났는데, 프로그램은 항상list에 있습니다.push_백업 () 줄이 붕괴되었습니다.코드는 다음과 같습니다. push백업 () 이 줄 코드 주석은 테스트 2 코드로 바꾸면 오류가 발생합니...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.