歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

POSIX線程的棧管理

  • POSIX標准沒有為線程的棧規定默認的大小,所以該值是根據實現而變化的;棧的最大容量也是由實現去定義。
  • 一旦超過棧的容量限制,程序會崩潰,或者數據損壞。
  • 可靠而又保證移植性的作法,是顯式地設置棧的大小,不使用默認值。
  • 有些實現要求線程的棧放在內存的特殊的地方,此時要使用pthread_attr_setstackaddr()函數。
  1. #include <stdlib.h>   
  2. #include <pthread.h>   
  3.   
  4. // 通過調節三個參數,了解當前計算機的線程棧容量   
  5. #define NTHREADS    4   
  6. #define N           1000   
  7. #define MEGEXTRA    1000000   
  8.   
  9. pthread_attr_t attr;  
  10.   
  11. void *dowork(void *threadid)  
  12. {  
  13.     size_t mystacksize;  
  14.     pthread_attr_getstacksize (&attr, &mystacksize);  
  15.     printf("[WORKER THREAD %ld] Stack size = %li bytes \n", (long)threadid, mystacksize);  
  16.   
  17.     // 輔助線程的棧絕大部分耗在下面這個數組上了。   
  18.     // 因為給每個線程多分配了MEGEXTRA字節空間,故而運行沒問題。   
  19.     // 可以嘗試設置負數的MEGEXTRA,看程序如何報錯。   
  20.     double A[N][N];  
  21.     for (int i=0; i<N; i++)  
  22.     {  
  23.         for (int j=0; j<N; j++)  
  24.         {  
  25.             A[i][j] = ((i*j)/3.452) + (N-i);  
  26.         }  
  27.     }  
  28.     return NULL;  
  29. }  
  30.   
  31. int _tmain(int argc, _TCHAR* argv[])  
  32. {  
  33.     size_t stacksize;  
  34.     long t;  
  35.   
  36.     pthread_attr_init(&attr);  
  37.     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);  
  38.   
  39.     pthread_attr_getstacksize (&attr, &stacksize);  
  40.     printf("[MASTER THREAD] Default stack size = %li\n", stacksize);  
  41.   
  42.     stacksize = sizeof(double) * N * N + MEGEXTRA;  
  43.     pthread_attr_setstacksize (&attr, stacksize);  
  44.     printf("[MASTER THREAD] Creating threads with stack size = %li bytes\n",stacksize);  
  45.   
  46.     pthread_t threads[NTHREADS];  
  47.     for(t=0; t<NTHREADS; t++)  
  48.     {  
  49.         int rc = pthread_create(&threads[t], &attr, dowork, (void *)t);  
  50.         if (rc)  
  51.         {  
  52.             printf("[MASTER THREAD] ERROR; return code from pthread_create() is %d\n", rc);  
  53.             exit(-1);  
  54.         }  
  55.     }  
  56.   
  57.     for(t=0; t<NTHREADS; t++)  
  58.     {  
  59.         pthread_join(threads[t], NULL);  
  60.     }  
  61.     return 0;  
  62. }  
我在WinXP上試驗時,得到棧的默認大小是零,這是為什麼?
Copyright © Linux教程網 All Rights Reserved