- POSIX標准沒有為線程的棧規定默認的大小,所以該值是根據實現而變化的;棧的最大容量也是由實現去定義。
- 可靠而又保證移植性的作法,是顯式地設置棧的大小,不使用默認值。
- 有些實現要求線程的棧放在內存的特殊的地方,此時要使用pthread_attr_setstackaddr()函數。
- #include <stdlib.h>
- #include <pthread.h>
-
- // 通過調節三個參數,了解當前計算機的線程棧容量
- #define NTHREADS 4
- #define N 1000
- #define MEGEXTRA 1000000
-
- pthread_attr_t attr;
-
- void *dowork(void *threadid)
- {
- size_t mystacksize;
- pthread_attr_getstacksize (&attr, &mystacksize);
- printf("[WORKER THREAD %ld] Stack size = %li bytes \n", (long)threadid, mystacksize);
-
- // 輔助線程的棧絕大部分耗在下面這個數組上了。
- // 因為給每個線程多分配了MEGEXTRA字節空間,故而運行沒問題。
- // 可以嘗試設置負數的MEGEXTRA,看程序如何報錯。
- double A[N][N];
- for (int i=0; i<N; i++)
- {
- for (int j=0; j<N; j++)
- {
- A[i][j] = ((i*j)/3.452) + (N-i);
- }
- }
- return NULL;
- }
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- size_t stacksize;
- long t;
-
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
-
- pthread_attr_getstacksize (&attr, &stacksize);
- printf("[MASTER THREAD] Default stack size = %li\n", stacksize);
-
- stacksize = sizeof(double) * N * N + MEGEXTRA;
- pthread_attr_setstacksize (&attr, stacksize);
- printf("[MASTER THREAD] Creating threads with stack size = %li bytes\n",stacksize);
-
- pthread_t threads[NTHREADS];
- for(t=0; t<NTHREADS; t++)
- {
- int rc = pthread_create(&threads[t], &attr, dowork, (void *)t);
- if (rc)
- {
- printf("[MASTER THREAD] ERROR; return code from pthread_create() is %d\n", rc);
- exit(-1);
- }
- }
-
- for(t=0; t<NTHREADS; t++)
- {
- pthread_join(threads[t], NULL);
- }
- return 0;
- }
我在WinXP上試驗時,得到棧的默認大小是零,這是為什麼?