歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> POSIX線程的棧管理

POSIX線程的棧管理

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