POSIX thread의 Stack 크기 설정

2554 단어
삽입식 시스템에서 메모리의 점용을 줄이기 위해 때때로 라인의 Stack 크기를 설정해야 한다. (기본 크기가 너무 크기 때문이다.)
다음 코드는 시스템의 기본 Stack 크기를 먼저 읽은 다음 크기를 다시 설정한 다음 다시 읽습니다.
4
#include 
#include 
#include 
#include 
void *foo(void *arg)
{
	int size = 0;
	pthread_attr_t attr;
	pthread_attr_init(&attr);
	pthread_attr_getstacksize(&attr, &size);
	printf("get stack size : %dK
", size/1024); return 0; } int main(int argc, char ** argv) { pthread_t id = -1; pthread_attr_t attr; int size = 0; if(argc != 2) { return -1; } pthread_attr_init(&attr); pthread_attr_getstacksize(&attr, &size); printf("the default pthread stack size: %dK
", size/1024); size = atoi(argv[1]); if( pthread_attr_setstacksize(&attr, size) != 0) { int err =errno; // printf("set stack size error: %dK, (%d) (%s)
", size/1024, err, strerror(err)); printf("set stack size error
"); } pthread_create(&id, &attr, foo, NULL); pthread_join(id, NULL); pthread_attr_destroy(&attr); return 0; }
명령 실행 gcc -g -pthread getstacksize.c -lpthread
, 그리고 Stack size:
$ ./a.out  1024
the default pthread stack size: 8192K
set stack size error
get stack size : 8192K
charles@taotao:~$ ./a.out  262144
the default pthread stack size: 8192K
get stack size : 8192K
charles@taotao:~$ ./a.out  2097152
the default pthread stack size: 8192K
get stack size : 8192K

1024(1K)를 처음 설정하는 데 실패했습니다. Stack size는 기본 8M(8192K)입니다.
두 번째 설정은 262144(256K)에 성공했지만 Stack size는 8M입니다.
세 번째도 마찬가지다.
왜 설정한 Stack size가 제대로 되돌아오지 않았을까요?
오늘 이 문제를 다시 봤는데 함수 pthread 에 대한attr_init () 의 사용에 문제가 있습니다.
이 함수는 전송된 pthread 에attr_t 변수를 초기화하면 Stack size가 0으로 설정됩니다.
Pthreadattr_getstacksize 함수는 전송된attr의stacksize를 판단합니다. 0이면 시스템의 기본stacksize를 사용합니다.
int
__pthread_attr_getstacksize (attr, stacksize)
     const pthread_attr_t *attr;
     size_t *stacksize;
{
  struct pthread_attr *iattr;

  assert (sizeof (*attr) >= sizeof (struct pthread_attr));
  iattr = (struct pthread_attr *) attr;

  size_t size = iattr->stacksize;

  /* If the user has not set a stack size we return what the system
     will use as the default.  */
  if (size == 0)
    {
      lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
      size = __default_pthread_attr.stacksize;
      lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
    }
  *stacksize = size;

  return 0;
}

좋은 웹페이지 즐겨찾기