乙個經典的多執行緒同步問題01 問題重現

2021-08-22 08:23:32 字數 842 閱讀 3636

程式描述:

主線程啟動10個子執行緒並將表示子線程式號的變數位址作為引數傳遞給子執行緒。子執行緒接收引數 -> sleep(50) -> 全域性變數++ -> sleep(50) -> 輸出引數和全域性變數。

要求:1.子執行緒輸出的線程式號不能重複。

2.全域性變數的輸出必須遞增。

下面畫了個簡單的示意圖:

分析下這個問題的考察點,主要考察點有二個:

1.主線程建立子執行緒並傳入乙個指向變數位址的指標作引數,由於執行緒啟動須要花費一定的時間,所以在子執行緒根據這個指標訪問並儲存資料前,主線程應等待子執行緒儲存完畢後才能改動該引數並啟動下乙個執行緒。這涉及到主線程與子執行緒之間的同步

2.子執行緒之間會互斥的改動和輸出全域性變數。要求全域性變數的輸出必須遞增。這涉及到各子執行緒間的互斥

下面給出沒有任何同步和互斥措施的問題程式,後期我們嘗試著用不同的方案(關鍵段,互斥量,事件,訊號量)來解決這個問題.

#include #include #include long lglobvar = 0;//全域性資源

unsigned int winapi threadproc(void* lpparam)

void main()

//保證子執行緒已全部執行結束

waitformultipleobjects(10, hthreads, true, infinite);

for(int i = 0; i < 10; i++)

}

乙個經典的多執行緒同步問題

本篇文章參考了 程式描述 主線程啟動10個子執行緒並將表示子線程式號的變數位址作為引數傳遞給子執行緒。子執行緒接收引數 sleep 50 全域性變數 sleep 0 輸出引數和全域性變數。要求 1 子執行緒輸出的線程式號不能重複。2 全域性變數的輸出必須遞增。下面畫了個簡單的示意圖 分析下這個問題的...

乙個經典的多執行緒同步問題 問題引入

下面來看乙個經典的多執行緒的同步和互斥的問題,問題的描述 主線程啟動10個子執行緒並將表示子線程式號的變數的位址作為引數傳遞給子執行緒。子執行緒接收引數 sleep 50 全域性變數 sleep 0 輸出引數和全域性變數。要求 1.子執行緒輸出的線程式號不能重複 2.全域性變數的輸出必須是遞增的 下...

乙個多執行緒同步問題

昨天,路過的時候,發現了這個問題 class syncclass catch exception e system.out.println class test implements runnable public void run 輸出結果如圖 其實synchronized void synmth...