Linux多執行緒面試題

shuilaner_發表於2018-11-29

轉:http://www.linuxidc.com/Linux/2012-05/60857.htm

前面的選擇題那些跳過,直接看最後的程式設計題。

第三題(某培訓機構的練習題):

子執行緒迴圈 10 次,接著主執行緒迴圈 100 次,接著又回到子執行緒迴圈 10 次,接著再回到主執行緒又迴圈 100 次,如此迴圈50次,試寫出程式碼。

第四題(迅雷筆試題):

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

第五題(Google面試題)

有四個執行緒1、2、3、4。執行緒1的功能就是輸出1,執行緒2的功能就是輸出2,以此類推.........現在有四個檔案ABCD。初始都為空。現要讓四個檔案呈如下格式:

A:1 2 3 4 1 2....

B:2 3 4 1 2 3....

C:3 4 1 2 3 4....

D:4 1 2 3 4 1....

請設計程式。


第六題

生產者消費者問題

這是一個非常經典的多執行緒題目,題目大意如下:有一個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,在兩者之間設定一個有多個緩衝區的緩衝池,生產者將它生產的產品放入一個緩衝區中,消費者可以從緩衝區中取走產品進行消費,所有生產者和消費者都是非同步方式執行的,但它們必須保持同步,即不允許消費者到一個空的緩衝區中取產品,也不允許生產者向一個已經裝滿產品且尚未被取走的緩衝區中投放產品。

第七題

讀者寫者問題

這也是一個非常經典的多執行緒題目,題目大意如下:有一個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者讀時寫者也不能寫。

 

第三題、第四題、第五題第一反應用條件變數來實現。第六題和第七題用讀寫鎖來實現。

第三題、第四題、第五題和我這篇linux多執行緒學習 (見 http://www.linuxidc.com/Linux/2012-05/60858.htm ) 舉得那例子很相似,只需要少量修改就能完成要求。不多說,直接上程式碼。

第四題程式碼:

  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <pthread.h>   
  4. #include <unistd.h>   
  5. #include <string.h>   
  6. //#define DEBUG 1   
  7. #define NUM 3   
  8.   
  9. int n=0;  
  10. pthread_mutex_t mylock=PTHREAD_MUTEX_INITIALIZER;  
  11. pthread_cond_t qready=PTHREAD_COND_INITIALIZER;  
  12. void * thread_func(void *arg)  
  13. {  
  14.     int param=(int)arg;  
  15.     char c='A'+param;  
  16.     int ret,i=0;  
  17.     for (; i < 10; i++)  
  18.     {  
  19.         pthread_mutex_lock(&mylock);  
  20.         while (param != n)  
  21.         {  
  22. #ifdef DEBUG   
  23.             printf("thread %d waiting\n", param);  
  24. #endif   
  25.             ret = pthread_cond_wait(&qready, &mylock);  
  26.             if (ret == 0)   
  27.             {  
  28. #ifdef DEBUG   
  29.                 printf("thread %d wait success\n", param);  
  30. #endif   
  31.             } else   
  32.             {  
  33. #ifdef DEBUG   
  34.                 printf("thread %d wait failed:%s\n", param, strerror(ret));  
  35. #endif   
  36.             }  
  37.         }  
  38.        // printf("%d ",param+1);   
  39.         printf("%c ",c);  
  40.         n=(n+1)%NUM;  
  41.         pthread_mutex_unlock(&mylock);  
  42.         pthread_cond_broadcast(&qready);  
  43.     }      
  44.     return (void *)0;  
  45. }  
  46. int main(int argc, char** argv) {  
  47.       
  48.     int i=0,err;  
  49.     pthread_t tid[NUM];  
  50.     void *tret;  
  51.     for(;i<NUM;i++)  
  52.     {  
  53.         err=pthread_create(&tid[i],NULL,thread_func,(void *)i);  
  54.         if(err!=0)  
  55.         {  
  56.             printf("thread_create error:%s\n",strerror(err));  
  57.             exit(-1);  
  58.         }  
  59.     }  
  60.     for (i = 0; i < NUM; i++)  
  61.     {  
  62.         err = pthread_join(tid[i], &tret);  
  63.         if (err != 0)  
  64.         {  
  65.             printf("can not join with thread %d:%s\n", i,strerror(err));  
  66.             exit(-1);  
  67.         }  
  68.     }  
  69.     printf("\n");  
  70.     return 0;  
  71. }  

執行結果:

 

第五題:

選項A,程式碼只需要將NUM改為4,printf("%c ",c)改為printf("%d ",param+1);即可

執行結果如下:

選項B,將全域性變數n改為1

選項C,將全域性變數n改為2

選項D,將全域性變數n改為3

相關文章