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

Linux多線程──3個子線程輪流運行

迅雷筆試題:

編寫一個程序,開啟3個線程,這3個線程的ID分別為A、B、C,每個線程將自己的ID在屏幕上打印10遍,要求輸出結果必須按ABC的順序顯示;如:ABCABC….依次遞推。

程序:

  1. #include <pthread.h>   
  2. #include <cstdio>   
  3.   
  4. const int THREAD_NUMBER = 3;  
  5.   
  6. // 子線程的互斥量和條件變量   
  7. pthread_mutex_t thread_mutex[THREAD_NUMBER];  
  8. pthread_cond_t thread_cond[THREAD_NUMBER];  
  9.   
  10. // 子線程是否正在等待   
  11. bool thread_wait_flag[THREAD_NUMBER];  
  12.   
  13. // 標識輪到哪個子線程輸出其ID   
  14. pthread_mutex_t mutex;  
  15. int thread_turn;  
  16.   
  17. void *thread_func(void *arg);  
  18.   
  19. int main(int argc, char **argv)  
  20. {  
  21.     pthread_t tids[THREAD_NUMBER];  
  22.   
  23.     for (int i = 0; i < THREAD_NUMBER; ++i)  
  24.     {  
  25.         pthread_mutex_init(&thread_mutex[i], NULL);  
  26.         pthread_cond_init(&thread_cond[i], NULL);  
  27.     }  
  28.       
  29.     pthread_mutex_init(&mutex, NULL);  
  30.     thread_turn = 0;  
  31.       
  32.     for (int i = 0; i < THREAD_NUMBER; ++i)  
  33.         thread_wait_flag[i] = false;  
  34.       
  35.     for (int i = 0; i < THREAD_NUMBER; ++i)  
  36.     {  
  37.         pthread_create(&tids[i], NULL, thread_func, (void *)i);  
  38.     }  
  39.   
  40.     for (int i = 0; i < THREAD_NUMBER; ++i)  
  41.     {  
  42.         pthread_join(tids[i], NULL);  
  43.     }  
  44.     printf("\n");  
  45.     return 0;  
  46. }  
  47.   
  48. void *thread_func(void *arg)  
  49. {  
  50.     int id = (int)arg;  
  51.     char ch = 'A' + id;  
  52.     int count = 0;  
  53.       
  54.     while (true)  
  55.     {  
  56.         if (id == thread_turn) // 若輪到當前子線程,輸出ID,發送信號   
  57.         {  
  58.             printf("%c", ch);  
  59.             ++count;  
  60.             if (id == THREAD_NUMBER-1 && count == 10) // 若是第3個子線程,輸出ID後,可直接退出。   
  61.                 break;  
  62.             pthread_mutex_lock(&mutex);  
  63.             ++thread_turn;  
  64.             thread_turn %= THREAD_NUMBER;  
  65.             pthread_mutex_unlock(&mutex);  
  66.               
  67.             while (true)  
  68.             {  
  69.                 pthread_mutex_lock(&thread_mutex[thread_turn]);  
  70.                 if (true == thread_wait_flag[thread_turn])  
  71.                 {  
  72.                     pthread_cond_signal(&thread_cond[thread_turn]);  
  73.                     pthread_mutex_unlock(&thread_mutex[thread_turn]);  
  74.                     break;  
  75.                 }  
  76.                 pthread_mutex_unlock(&thread_mutex[thread_turn]);  
  77.             }  
  78.             if (count == 10) // 若是第1、2個子線程,發出信號後,退出   
  79.                 break;  
  80.         }  
  81.         else // 否則,等待   
  82.         {  
  83.             pthread_mutex_lock(&thread_mutex[id]);  
  84.             thread_wait_flag[id] = true;  
  85.             pthread_cond_wait(&thread_cond[id], &thread_mutex[id]);  
  86.             thread_wait_flag[id] = false;  
  87.             pthread_mutex_unlock(&thread_mutex[id]);  
  88.         }  
  89.     }  
  90.     return (void *)0;  
  91. }  
Copyright © Linux教程網 All Rights Reserved