本篇文章參考了
程式描述:
主線程啟動10個子執行緒並將表示子線程式號的變數位址作為引數傳遞給子執行緒。子執行緒接收引數-> sleep(50) -> 全域性變數++ -> sleep(0) -> 輸出引數和全域性變數。
要求:1.子執行緒輸出的線程式號不能重複。
2.全域性變數的輸出必須遞增。
下面畫了個簡單的示意圖:
分析下這個問題的考察點,主要考察點有二個:
1.主線程建立子執行緒並傳入乙個指向變數位址的指標作引數,由於執行緒啟動須要花費一定的時間,所以在子執行緒根據這個指標訪問並儲存資料前,主線程應等待子執行緒儲存完畢後才能改動該引數並啟動下乙個執行緒。這涉及到主線程與子執行緒之間的同步。
2.子執行緒之間會互斥的改動和輸出全域性變數。要求全域性變數的輸出必須遞增。這涉及到各子執行緒間的互斥。
下面列出這個程式的基本框架,可以在此**基礎上進行修改和驗證。
//經典執行緒同步互斥問題執行結果可以參考下列圖示,#include #include #include long g_nnum; //全域性資源
unsigned int __stdcall fun(void *ppm); //執行緒函式
const int thread_num = 10; //子執行緒個數
int main()
//保證子執行緒已全部執行結束
waitformultipleobjects(thread_num, handle, true, infinite);
return 0;
}unsigned int __stdcall fun(void *ppm)
可以看出,執行結果完全是混亂和不可預知的。本系列將會運用
windows
乙個經典的多執行緒同步問題 問題引入
下面來看乙個經典的多執行緒的同步和互斥的問題,問題的描述 主線程啟動10個子執行緒並將表示子線程式號的變數的位址作為引數傳遞給子執行緒。子執行緒接收引數 sleep 50 全域性變數 sleep 0 輸出引數和全域性變數。要求 1.子執行緒輸出的線程式號不能重複 2.全域性變數的輸出必須是遞增的 下...
乙個經典的多執行緒同步問題01 問題重現
程式描述 主線程啟動10個子執行緒並將表示子線程式號的變數位址作為引數傳遞給子執行緒。子執行緒接收引數 sleep 50 全域性變數 sleep 50 輸出引數和全域性變數。要求 1 子執行緒輸出的線程式號不能重複。2 全域性變數的輸出必須遞增。下面畫了個簡單的示意圖 分析下這個問題的考察點,主要考...
乙個多執行緒同步問題
昨天,路過的時候,發現了這個問題 class syncclass catch exception e system.out.println class test implements runnable public void run 輸出結果如圖 其實synchronized void synmth...