多核cpu電腦運行多線程程序的問題


呵呵,當初我學多線程時也遇到過這樣的問題,也是輸出的結果每次都不一樣。后來我找到原因了---都是多核惹得禍。
我猜你的電腦應該也是多核的。單核的cpu在處理多線程時每次只能執行一跳指令,也就是說無論你的程序有多少個線程,
每一時刻執行的也只是一個線程里的代碼,cpu會輪流給每個線程分配時間片,時間片分配到哪個線程頭上,哪個線程里
的代碼就執行。但是多核cpu就不一樣了,他可以同時執行多個線程里的代碼,這才是真正的“多線程”。所以你那段程序,
在單核的電腦上跑應該是沒有問題的,但是在多核cpu的電腦上出現的結果就會有很大的隨機性。
就你貼的那張圖來說,左邊的運行時恰好是這樣的,首先cpu1執行你主線程里的代碼 在終端輸出
Now another thread has been created. ID =,但是由於多個cpu是同時進行的,而這時cpu2已經開始執行ThreadProc里的代碼,
也要開始向終端輸出字符,而你的屏幕只有一個,恰好這時cpu1的時間片被移走了,所以cpu2開始執行ThreadProc里的代碼向屏幕上輸出,
直到打完I am from a thread 17后,恰好cpu2的時間片被移走了,這時cpu1接着向屏幕打dwThreadId的值,這就出現了4660.
接着又是cpu2執行完ThreadProc中剩余的代碼又打了幾行。
右邊的這個程序運行時,恰好就是cpu1執行主線程代碼輸出完后,cpu2再執行線程函數中代碼,符合你的預期。
但是,關鍵問題在於,你無法預測每個cpu的時間片分配。所以,要得到你想要的輸出結果就屬於隨機事件了。
對與多核cpu 上的程序同步問題,最好不要用信號量,互斥量,事件對象,因為它們都屬於內核對象,都是對一個cpu而言的。
其他的cpu根本不會理睬你設置的這些東西。另外你的WaitForSingleObject (hThread, INFINITE); 也是在一個cpu里等待線程函數返回,對cpu2沒有任何作用。
建議你用臨界區(Critical Section)來實現多線程同步,因為臨界區不是內核對象,他只是在進程內存中一塊區域,
無論有多少個cpu,任何時刻只能有一個線程訪問這塊內存區域,只需將你打印的部分放到臨界區里就行了。

ps: kdzhy2008推薦的 侯捷 譯的《win32多線程程序設計》確實是本好書,雖然是97年出版的,但是很多東西對現在還是很有啟迪的。
希望對你能有所幫助,呵呵~~

轉載自: http://zhidao.baidu.com/link?url=LDgfcm734NqVk_g05SmzPofxCRnUBuLX2zbV0xgLI6OnAPntyyrG7o2RjUXeotkg7F48MxzR3EuH-VGg7j6eRq


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM