Linux多執行緒面試題
轉: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 ) 舉得那例子很相似,只需要少量修改就能完成要求。不多說,直接上程式碼。
第四題程式碼:
- #include <stdio.h>
- #include <stdlib.h>
- #include <pthread.h>
- #include <unistd.h>
- #include <string.h>
- //#define DEBUG 1
- #define NUM 3
- int n=0;
- pthread_mutex_t mylock=PTHREAD_MUTEX_INITIALIZER;
- pthread_cond_t qready=PTHREAD_COND_INITIALIZER;
- void * thread_func(void *arg)
- {
- int param=(int)arg;
- char c='A'+param;
- int ret,i=0;
- for (; i < 10; i++)
- {
- pthread_mutex_lock(&mylock);
- while (param != n)
- {
- #ifdef DEBUG
- printf("thread %d waiting\n", param);
- #endif
- ret = pthread_cond_wait(&qready, &mylock);
- if (ret == 0)
- {
- #ifdef DEBUG
- printf("thread %d wait success\n", param);
- #endif
- } else
- {
- #ifdef DEBUG
- printf("thread %d wait failed:%s\n", param, strerror(ret));
- #endif
- }
- }
- // printf("%d ",param+1);
- printf("%c ",c);
- n=(n+1)%NUM;
- pthread_mutex_unlock(&mylock);
- pthread_cond_broadcast(&qready);
- }
- return (void *)0;
- }
- int main(int argc, char** argv) {
- int i=0,err;
- pthread_t tid[NUM];
- void *tret;
- for(;i<NUM;i++)
- {
- err=pthread_create(&tid[i],NULL,thread_func,(void *)i);
- if(err!=0)
- {
- printf("thread_create error:%s\n",strerror(err));
- exit(-1);
- }
- }
- for (i = 0; i < NUM; i++)
- {
- err = pthread_join(tid[i], &tret);
- if (err != 0)
- {
- printf("can not join with thread %d:%s\n", i,strerror(err));
- exit(-1);
- }
- }
- printf("\n");
- return 0;
- }
執行結果:
第五題:
選項A,程式碼只需要將NUM改為4,printf("%c ",c)改為printf("%d ",param+1);即可
執行結果如下:
選項B,將全域性變數n改為1
選項C,將全域性變數n改為2
選項D,將全域性變數n改為3
相關文章
- 多執行緒面試題執行緒面試題
- 多執行緒-多執行緒常見的面試題執行緒面試題
- 多執行緒面試題1執行緒面試題
- java多執行緒面試題Java執行緒面試題
- Java多執行緒面試高配問題---多執行緒(3)🧵Java執行緒面試
- 多執行緒經典面試題執行緒面試題
- 15個Java多執行緒面試題Java執行緒面試題
- 50個Java多執行緒面試題Java執行緒面試題
- 【面經】多執行緒常見面試題執行緒面試題
- Java 多執行緒面試問題彙總Java執行緒面試
- 敲開阿里大門的執行緒、多執行緒和執行緒池面試專題阿里執行緒面試
- 史上最全 Java 多執行緒面試題及答案Java執行緒面試題
- BATJ都愛問的多執行緒面試題BAT執行緒面試題
- 史上最全Java多執行緒面試題,附答案Java執行緒面試題
- Java常用面試題之Java多執行緒(十三)Java面試題執行緒
- java多執行緒、集合和IO面試題_02Java執行緒面試題
- 精選30道Java多執行緒面試題Java執行緒面試題
- 秒殺多執行緒面試題系列-如何使用多執行緒,詳細分析多執行緒的重點難點必考點——多執行緒同步互斥問題。各文章講解生動細緻,針對性強。必定也能助你在面試中秒殺所有多執行緒面試題...執行緒面試題
- 4、Linux多執行緒,執行緒同步(2)Linux執行緒
- 多執行緒問題執行緒
- Java多執行緒與併發基礎面試題Java執行緒面試題
- 你會這道阿里多執行緒面試題嗎?阿里執行緒面試題
- 43道多執行緒面試題,附帶答案(三)執行緒面試題
- 25道多執行緒面試題,附帶答案(一)執行緒面試題
- 43道多執行緒面試題,附帶答案(二)執行緒面試題
- java多執行緒執行問題Java執行緒
- 面試集錦(十四)多執行緒面試執行緒
- java 多執行緒 併發 面試Java執行緒面試
- linux-多執行緒Linux執行緒
- 【Java面試題】Java面試之多執行緒!Java面試題執行緒
- 一份多執行緒面試題及參考答案執行緒面試題
- 面試系列-40個Java多執行緒問題總結面試Java執行緒
- 15個頂級Java多執行緒面試題及回答Java執行緒面試題
- 15個頂級Java多執行緒面試題及答案Java執行緒面試題
- 多執行緒和多執行緒同步執行緒
- 多執行緒程式設計,處理多執行緒的併發問題(執行緒池)執行緒程式設計
- 面試-實現多執行緒的方式面試執行緒
- 多執行緒面試題之多執行緒有幾種實現方案,分別是什麼執行緒面試題