Drecik學習經驗分享
轉載請註明出處:http://blog.csdn.net/drecik__/article/details/8097806
1. 爲什麼需要線程同步
當應用程序使用多線程時候,很多情況下我們將讓多個線程訪問某一個共享資源,在訪問的時候我們就需要考慮的線程同步的問題,例如下面的代碼:咋一看感覺沒有什麼問題,兩個線程函數結束之後g_x爲2,但是,有個問題是我們不能知道確切的時候線程在做什麼,我們不能知道操作系統什麼時候把線程切換掉,所以我只能說g_x結果可能爲2,,假設將上面函數代碼編譯成了下面的彙編代碼:long g_x = 0; DWORD CALLBACK ThreadFunc1( LPVOID lpVoid ) { g_x++; return 0; } DWORD CALLBACK ThreadFunc2( LPVOID lpVoid ) { g_x++; return 0; }
如果一個線程先執行後一個線程後執行,那麼彙編代碼如下:MOV EAX, [g_x] INC EAX MOV [g_x], EAX
此時將得到正確的結果,但是當一個線程執行到一半的時候,系統切換到另一個線程則可能的代碼將如下:MOV EAX, [g_x] INC EAX MOV [g_x], EAX MOV EAX, [g_x] INC EAX MOV [g_x], EAX
此時g_x結果將爲1,所以我們應該保持線程的同步,在同一時刻保證只有一個線程訪問共享資源,操作系統給我們提供了兩種方法,一種是在用戶模式下進行線程同步,另一種是在內核模式下進行線程同步。MOV EAX, [g_x] INC EAX MOV EAX, [g_x] INC EAX MOV [g_x], EAX MOV [g_x], EAX
我將會在之後博文中分別介紹。
2. 什麼時候需要線程同步
以下兩種基本情況下,線程之間需要相互通信,保持同步:
- 需要讓多個線程同時訪問一個共享資源,同時不能破壞資源的完整性。
- 一個線程需要通知其他線程某項任務已經完成。