呵呵,當初我學多線程時也遇到過這樣的問題,也是輸出的結果每次都不一樣。後來我找到原因了---都是多核惹得禍。
我猜你的電腦應該也是多核的。單核的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年出版的,但是很多東西對現在還是很有啟迪的。
希望對你能有所幫助,呵呵~~