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

POSIX的只執行一次的pthread_once

POSIX的只執行一次的pthread_once

  1. #ifdef WIN32   
  2.     #include <windows.h>   
  3.     #define SLEEP(ms)               Sleep(ms)   
  4. #else if defined(LINUX)   
  5.     #include <stdio.h>   
  6.     #define SLEEP(ms) sleep(ms)   
  7. #endif   
  8.   
  9. #include <cassert>   
  10. #include <pthread.h>   
  11.   
  12. // 取出線程的ID   
  13. int GetThreadID()  
  14. {  
  15. #ifdef WIN32   
  16.     return (int)pthread_getw32threadhandle_np( pthread_self() );  
  17. #else if defined(LINUX)   
  18.     return (int)pthread_self();  
  19. #endif   
  20. }  
  21.   
  22. // 該靜態變量被所有線程使用   
  23. static int s_nThreadResult = 0;  
  24.   
  25. static pthread_once_t once = PTHREAD_ONCE_INIT;  
  26.   
  27. // 該初始化函數,我在多線程下只想執行一次   
  28. void thread_init()  
  29. {  
  30.     s_nThreadResult = -1;  
  31.     printf("[Child %0.4x] looping i(%0.8x)\n", GetThreadID(), s_nThreadResult);  
  32. }  
  33.   
  34. void * theThread(void * param)  
  35. {  
  36.     // 通過once的控制,thread_init只會被執行一次   
  37.     pthread_once(&once, &thread_init);  
  38.     printf("[Child %0.4x] looping i(%0.8x)\n", GetThreadID(), s_nThreadResult);  
  39.   
  40.     s_nThreadResult ++;  
  41.     pthread_exit(&s_nThreadResult);  
  42.   
  43.     return NULL;  
  44. }  
  45.   
  46. int main(int argc, char* argv[])  
  47. {  
  48.     pthread_t tid1, tid2;  
  49.     pthread_create(&tid1, NULL, &theThread, NULL);  
  50.     pthread_create(&tid2, NULL, &theThread, NULL);  
  51.   
  52.     // 無論是否休眠,兩個子線程最終都會被主線程join到   
  53.     // 因為兩個子線程都是默認的PTHREAD_CREATE_JOINABLE類型   
  54.     //SLEEP(3);   
  55.   
  56.     void * status = NULL;  
  57.     int rc = pthread_join(tid1, &status);  
  58.     assert(rc == 0 && "pthread_join 1", rc);  
  59.     if (status != PTHREAD_CANCELED && status != NULL)  
  60.     {  
  61.         printf("Returned value from thread: %d\n", *(int *)status);  
  62.     }  
  63.   
  64.     rc = pthread_join(tid2, &status);  
  65.     assert(rc == 0 && "pthread_join 2", rc);  
  66.     if (status != PTHREAD_CANCELED && status != NULL)  
  67.     {  
  68.         printf("Returned value from thread: %d\n", *(int *)status);  
  69.     }  
  70.   
  71.     return 0;  
  72. }  
Copyright © Linux教程網 All Rights Reserved