上一篇《秒殺多線程第三篇原子操作 Interlocked系列函數(shù)》中介紹了原子操作在多進程中的作用,,現(xiàn)在來個復雜點的。這個問題涉及到線程的同步和互斥,,是一道非常有代表性的多線程同步問題,,如果能將這個問題搞清楚,那么對多線程同步也就打下了良好的基礎,。
程序描述: 主線程啟動10個子線程并將表示子線程序號的變量地址作為參數(shù)傳遞給子線程,。子線程接收參數(shù) -> sleep(50) -> 全局變量++ -> sleep(0) -> 輸出參數(shù)和全局變量。 要求: 1.子線程輸出的線程序號不能重復,。 2.全局變量的輸出必須遞增,。 下面畫了個簡單的示意圖: 分析下這個問題的考察點,主要考察點有二個: 1.主線程創(chuàng)建子線程并傳入一個指向變量地址的指針作參數(shù),,由于線程啟動須要花費一定的時間,,所以在子線程根據(jù)這個指針訪問并保存數(shù)據(jù)前,主線程應等待子線程保存完畢后才能改動該參數(shù)并啟動下一個線程,。這涉及到主線程與子線程之間的同步,。 2.子線程之間會互斥的改動和輸出全局變量。要求全局變量的輸出必須遞增,。這涉及到各子線程間的互斥,。
下面列出這個程序的基本框架,可以在此代碼基礎上進行修改和驗證,。
運行結果可以參考下列圖示,,強烈建議讀者親自試一試。 圖1 圖2 圖3 可以看出,,運行結果完全是混亂和不可預知的,。本系列將會運用Windows平臺下各種手段包括關鍵段,事件,,互斥量,,信號量等等來解決這個問題并作一份全面的總結,敬請關注,。
《秒殺多線程第五篇 經(jīng)典線程同步 關鍵段CS》已經(jīng)發(fā)布,,歡迎參閱。 《秒殺多線程第六篇 經(jīng)典線程同步 事件Event》已經(jīng)發(fā)布,,歡迎參閱。 《秒殺多線程第七篇 經(jīng)典線程同步 互斥量Mutex》已經(jīng)發(fā)布,,歡迎參閱,。 《秒殺多線程第八篇 經(jīng)典線程同步 信號量Semaphore》已經(jīng)發(fā)布,歡迎參閱,。
轉載請標明出處,,原文地址:http://blog.csdn.net/morewindows/article/details/7442333 |
|