c + + Pthread 스 레 드 를 만 든 후 join 또는 detach 를 사용 하여 스 레 드 자원 을 방출 해 야 합 니 다.

4299 단어 pthread
http://www.cppblog.com/prayer/archive/2012/04/23/172427.html
 
이틀 동안 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);
}

좋은 웹페이지 즐겨찾기