C 프로그래밍 언어와 NPTL 2.6을 사용하는 멀티 스레드 모듈러 응용 프로그램을 개발 중입니다. 각 플러그인에 대해 POSIX 스레드가 작성됩니다. 문제는 기본 스택 크기가 사용자의 선택에 달려 있기 때문에 각 스레드마다 고유 한 스택 영역이 있기 때문에 경우에 따라 큰 메모리 소비가 발생할 수 있습니다.NPTL 기본 스택 크기 문제
pthread_attr_t attr;
pthread_attr_init (&attr);
pthread_attr_getstacksize(&attr, &st1);
if(pthread_attr_setstacksize (&attr, MODULE_THREAD_SIZE) != 0) perror("Stack ERR");
pthread_attr_getstacksize(&attr, &st2);
printf("OLD:%d, NEW:%d - MIN: %d\n", st1, st2, PTHREAD_STACK_MIN);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
/* "this" is static data structure that stores plugin related data */
pthread_create(&this->runner, &attr, (void *)(void *)this->run, NULL);
편집 I : :는 pthread_create() 섹션이 추가
내가 각 스레드를 작성하기 전에 스택 크기를 변경하려면이 비슷한을 사용하여 불필요한 메모리 사용을 방지합니다.내가 예상대로이 일을 작동하지 않았다는 pthread_attr_getstacksize()
에 의해보고 된 스택 크기가 변경 되나 (PS/최고/pmap의 출력에서) 응용 프로그램의 총 메모리 사용량은 변경되지 않았다
OLD : 10485760 , 새로운 : 65536 - MIN : 나는 응용 프로그램을 시작하기 전에
ulimit -s MY_STACK_SIZE_LIMIT
를 사용하는 경우 16384
나는 예상 된 결과를 얻을 수 있습니다.
내 질문은 :
1) 물론 스레드)를 작성하기 전에 (응용 프로그램을 시작한 후 (기본) 스레드 스택 크기를 변경하는 모든 휴대용 (UNIX 변종 사이) 방법이 있나요?
2) 모든 스레드에 동일한 스택 영역을 사용할 수 있습니까?
3) 많은 고통없이 스레드에 대한 스택을 완전히 비활성화 할 수 있습니까?
바보 같은 질문이지만'pthread_attr_setstacksize()'를 통해 스택 크기를 수정 한 후에 스레드를 실제로 만들 때'attr'을 사용합니까? 'pthread_create()'를 어떻게 호출하는지 볼 수 있습니까? –
물론, 내 게시물을 업데이 트했습니다. –