實現三條執行緒,分別列印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 ..........執行緒
- 多執行緒面試題之多執行緒有幾種實現方案,分別是什麼執行緒面試題
- Java之實現多執行緒的方式三:實現Callable介面(結合執行緒池使用)Java執行緒
- 純Mutex實現多執行緒交替列印Mutex執行緒
- 三個執行緒迴圈列印123-多執行緒執行緒
- 多執行緒實現順序迴圈列印執行緒
- AA BB CC AA執行緒列印 ,CC執行緒列印執行緒
- 【c++】c++11實現執行緒池C++執行緒
- postman的批次執行:用於多條介面測試用例批次執行,輸出介面測試測試結果Postman
- Java實現多執行緒的三種方式Java執行緒
- 建立執行緒的方式三:實現Callable介面執行緒
- 託管C++執行緒鎖實現C++執行緒
- 三個執行緒輪流列印 1-100執行緒
- 看起來是執行緒池的BUG,但是我認為是原始碼設計不合理。執行緒原始碼
- 【C++11】c++11實現執行緒池C++執行緒
- Java多執行緒【三種實現方法】Java執行緒
- 執行緒池的原理與C語言實現執行緒C語言
- 基於C++11的執行緒池實現C++執行緒
- js中var c=a||b;結果是什麼?JS
- 執行緒池的實現執行緒
- 多執行緒並行執行,然後彙總結果執行緒並行
- RxJava 是如何實現執行緒切換的(下)RxJava執行緒
- 執行緒間的協作(3)——管道輸入/輸出流執行緒
- Java獲取多執行緒執行結果方式的歸納與總結Java執行緒
- Java 執行緒池中的執行緒複用是如何實現的?Java執行緒
- 多執行緒(三)、執行緒池 ThreadPoolExecutor 知識點總結執行緒thread
- Java的通過管道來實現執行緒通訊Java執行緒
- Java多執行緒的實現Java執行緒
- python執行緒池的實現Python執行緒
- 執行緒池的實現原理執行緒
- C++ cout列印輸出 (解決輸出亂碼)C++
- SpringBoot執行緒池和Java執行緒池的實現原理Spring Boot執行緒Java
- python 實現計算器功能 輸入字串,輸出相應結果Python字串
- python 執行緒安全的 單例 實現 日誌分級Python執行緒單例
- join方法應用之一——按順序輸出三個執行緒執行緒
- easyexcel多sheet多執行緒匯入示例,獲取所以執行緒執行結果後返回Excel執行緒
- java執行緒實現的三種方式以及靜態代理Java執行緒
- laravel列印輸出完整sql,執行時間和explain分析LaravelSQLAI