實現三條執行緒,分別列印A,B,C,但是看到輸出來的結果是ABCABC……
剛出來找工作,面試官問我怎麼實現三條執行緒,分別列印A,B,C,但是看到輸出來的結果是ABCABC……這樣子,當時我第一反應是用訊號量呀。他反問那你需要創多少個?沒細想,其實三個就行了(有名訊號量的話),那語氣我還以為不行。又想了一會說訊號(signal)可以吧,他說可以,但是我用的又不太熟呀,除錯著寫估計能成,現場說不出來……最後問了其他人,原來那面試官想要我用條件變數和互斥鎖來實現……我會呀,說個思路完全沒問題,但是可能需要翻資料琢磨著寫,太久不用了……就想吐槽,能不能好好說話,就不能提示一下,你如果用條件變數來實現呢?……回來馬上就寫了出來,越想越不太對呀,理論上訊號,SPI物件都是用來執行緒間交流的呀,它關鍵不就等一個執行緒操作完通知下一個嘛?我這個思路沒問題呀
三條執行緒輪流列印ABC
C語言,條件變數互斥鎖實現
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t m; //互斥鎖
pthread_cond_t v; //條件變數
int input = 0; //列印埠就緒
void *thread1(void *args)
{
pthread_mutex_lock(&m); //上鎖
for(int i=0;i<10; i++)
{
while(input != 1)
pthread_cond_wait(&v, &m); //否則,進入等待佇列,自帶解鎖
printf("A\n"); //列印
input = 2;
pthread_cond_broadcast(&v); //喚醒所有執行緒
}
pthread_mutex_unlock(&m); //解鎖
return NULL;
}
void *thread2(void *args)
{
pthread_mutex_lock(&m); //上鎖
for(int i=0;i<10; i++)
{
while(input != 2)
pthread_cond_wait(&v, &m); //否則,進入等待佇列
printf("B\n"); //列印
input = 3;
pthread_cond_broadcast(&v); //喚醒所有執行緒
}
pthread_mutex_unlock(&m); //解鎖
return NULL;
}
void *thread3(void *args)
{
pthread_mutex_lock(&m); //上鎖
for(int i=0;i<10; i++)
{
while(input != 3)
pthread_cond_wait(&v, &m); //否則,進入等待佇列
printf("C\n"); //列印
input = 1;
pthread_cond_broadcast(&v); //喚醒所有執行緒
}
pthread_mutex_unlock(&m); //解鎖
return NULL;
}
int main()
{
printf("Input ABC text\n");
//初始化互斥鎖和條件變數
pthread_mutex_init(&m, NULL);
pthread_cond_init(&v, NULL);
//開啟列印開關,通知所有在條件佇列的執行緒
pthread_mutex_lock(&m);
input = 1; //開啟埠
pthread_cond_signal(&v);
pthread_mutex_unlock(&m);
//建立3條執行緒,並等待其結束
pthread_t tid1, tid2, tid3;
pthread_create(&tid1, NULL, thread1, NULL);
pthread_create(&tid2, NULL, thread2, NULL);
pthread_create(&tid3, NULL, thread3, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
pthread_join(tid3, NULL);
//銷燬互斥鎖和條件變數
pthread_mutex_destroy(&m);
pthread_cond_destroy(&v);
//退出
return 0;
}
相關文章
- 使用多執行緒實現輸出1-a 2-b 3-c 4-d ..........執行緒
- 多執行緒面試題之多執行緒有幾種實現方案,分別是什麼執行緒面試題
- 純Mutex實現多執行緒交替列印Mutex執行緒
- Java之實現多執行緒的方式三:實現Callable介面(結合執行緒池使用)Java執行緒
- C#中的執行緒(三)多執行緒C#執行緒
- 多執行緒實現順序迴圈列印執行緒
- 【執行計劃】格式化EXPLAIN PLAN的輸出結果AI
- AA BB CC AA執行緒列印 ,CC執行緒列印執行緒
- js中var c=a||b;結果是什麼?JS
- postman的批次執行:用於多條介面測試用例批次執行,輸出介面測試測試結果Postman
- 三個執行緒迴圈列印123-多執行緒執行緒
- 多執行緒並行執行,然後彙總結果執行緒並行
- Java實現多執行緒的三種方式Java執行緒
- 【c++】c++11實現執行緒池C++執行緒
- 看起來是執行緒池的BUG,但是我認為是原始碼設計不合理。執行緒原始碼
- Java獲取多執行緒執行結果方式的歸納與總結Java執行緒
- HTML5中實現進度條繫結輸出結果以及滑動條動態調整顏色案例HTML
- Java多執行緒【三種實現方法】Java執行緒
- [深入學習C#]C#實現多執行緒的方法:執行緒(Thread類)和執行緒池(ThreadPool)C#執行緒thread
- 託管C++執行緒鎖實現C++執行緒
- Android執行緒篇(一)實現執行緒的幾種方法及區別Android執行緒
- 【C++11】c++11實現執行緒池C++執行緒
- 建立執行緒的方式三:實現Callable介面執行緒
- 基於C++11的執行緒池實現C++執行緒
- c++實現程式與執行緒的同步互斥C++執行緒
- 執行緒池的原理與C語言實現執行緒C語言
- 執行結果
- RxJava 是如何實現執行緒切換的(上)RxJava執行緒
- RxJava 是如何實現執行緒切換的(下)RxJava執行緒
- MySQL執行計劃explain輸出列結果解析MySqlAI
- 執行緒池的實現執行緒
- 三個執行緒輪流列印 1-100執行緒
- python 實現計算器功能 輸入字串,輸出相應結果Python字串
- Java資料庫分表與多執行緒查詢結果彙總Java資料庫執行緒
- 執行緒間的協作(3)——管道輸入/輸出流執行緒
- C#.Net前臺執行緒與後臺執行緒的區別C#執行緒
- Java的通過管道來實現執行緒通訊Java執行緒
- Java 執行緒池中的執行緒複用是如何實現的?Java執行緒