標準輸出也可以是一個共享資源
目錄
1.目標需求
想要主執行緒和子執行緒分別完整列印出HELLOWORLD和helloword,每個執行緒都要分兩次列印,不能一起列印。實現這個需求。
2.分析
標準輸出對於兩個執行緒來說也是共享資源,需要加上對共享資源的保護。這裡需要實現的是執行緒間的同步。
3.不符合要求的程式碼
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
void *tnf(void *arg)
{
srand(time(NULL));
while(1)
{
printf("hello");
sleep(rand()%3);
printf("world\n");
sleep(rand()%3);
}
return NULL;
}
int main()
{
pthread_t tid;
srand(time(NULL));
pthread_create(&tid,NULL,tnf,NULL);
while(1)
{
printf("HELLO");
sleep(rand()%3);
printf("WORLD\n");
sleep(rand()%3);
}
return 0;
}
4.符合要求的程式碼
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
pthread_mutex_t mutex;
void *tnf(void *arg)
{
srand(time(NULL));
while(1)
{
pthread_mutex_lock(&mutex);
printf("hello");
sleep(rand()%3);
printf("world\n");
pthread_mutex_unlock(&mutex);
sleep(rand()%3);
}
return NULL;
}
int main()
{
pthread_t tid;
srand(time(NULL));
pthread_create(&tid,NULL,tnf,NULL);
while(1)
{
pthread_mutex_lock(&mutex);
printf("HELLO");
sleep(rand()%3);
printf("WORLD\n");
pthread_mutex_unlock(&mutex);
sleep(rand()%3);
}
pthread_mutex_destroy(&mutex);
return 0;
}
5.觀察與思考
以下程式碼,與上一份程式碼作比較,結合列印現象思考關於鎖的粒度與CPU被奪走的可能性:
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
pthread_mutex_t mutex;
void *tnf(void *arg)
{
srand(time(NULL));
while(1)
{
pthread_mutex_lock(&mutex);
printf("hello");
sleep(rand()%3);
printf("world\n");
sleep(rand()%3);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main()
{
pthread_t tid;
srand(time(NULL));
pthread_create(&tid,NULL,tnf,NULL);
while(1)
{
pthread_mutex_lock(&mutex);
printf("HELLO");
sleep(rand()%3);
printf("WORLD\n");
sleep(rand()%3);
pthread_mutex_unlock(&mutex);
}
pthread_mutex_destroy(&mutex);
return 0;
}
6.說明
在訪問貢獻資源前加鎖,訪問結束後立即解鎖,一般來說,在滿足需求的情況下,鎖的粒度越小越好。
相關文章
- Linux的標準輸入、標準輸出和標準錯誤Linux
- Java —— 標準輸入輸出Java
- python 標準輸入輸出Python
- 權威AI開源標準1.0版釋出:Llama也不算開源AI
- 指令碼日誌的標準輸出指令碼
- 標準化/結構化 JSON 輸出JSON
- C++名稱空間、標準輸入輸出、引用C++
- JDK 18 及以上使用標準輸出流中文輸出亂碼問題JDK
- linux自動清理Docker標準輸出日誌LinuxDocker
- Linux基礎知識4:重定向、標準輸出和標準錯誤、man、tldrLinux
- ECMA標準ECMAScript(JavaScript的一個標準)和C#JavaScriptC#
- converter設計模式擴充套件,多種輸入輸出與標準輸入輸出的轉化方案設計模式套件
- 輸入一個3,輸出March,輸入一個數字月份,然後對應輸出相應的英文表示,用指標陣列完成指標陣列
- Linux基礎命令---echo列印內容到標準輸出Linux
- 共享資源那麼多,如何用一把鎖保護多個資源?
- Oracle 資料庫安全許可權配置標準Oracle資料庫
- 015 Linux 標準輸入輸出、重定向、管道和後臺啟動程式命令Linux
- 資料治理--03資料標準 形成企業自身標準6個文件, 怎麼透過資料標準一步步建表
- 標準的位元組輸出流 & 如何用它寫一篇日誌檔案
- Kubernetes 如何成為計算資源的標準
- Pr入門教程標準模板的使用方法及完成輸出
- 利用可變長度引數定義一個函式,輸入為任意個數的數值,功能為對輸入資料求和並輸出;函式
- 輸入一個數倒序輸出(遞迴)遞迴
- 跨域資源共享跨域
- 一個可拖拽的React標籤元件React元件
- 字串指標的輸出字串指標
- 給免費網遊畫皮膚,也可以是個脫貧致富的勵志故事
- 輸入一個ASCII碼,輸出對應的字元ASCII字元
- 高質量外鏈的判斷標準和來源:標準明確,來源廣泛
- 13.Linuxshell程式設計(條件語句和標準輸出重定向)Linux程式設計
- sqlldr標準輸出未處理導致批處理掛起問題SQL
- Go基礎系列:讀取標準輸入Go
- CSDN資源共享規範
- 跨域資源共享(CORS)跨域CORS
- 共享資源庫系統
- 跨域資源共享CORS跨域CORS
- 跨域資源共享——CORS跨域CORS
- multiprocessing多程式資源共享