Windows核心編程學習筆記(16)--線程同步

Drecik學習經驗分享

轉載請註明出處:http://blog.csdn.net/drecik__/article/details/8097806

 

1. 爲什麼需要線程同步

當應用程序使用多線程時候,很多情況下我們將讓多個線程訪問某一個共享資源,在訪問的時候我們就需要考慮的線程同步的問題,例如下面的代碼:
long g_x = 0;
DWORD CALLBACK ThreadFunc1( LPVOID lpVoid )
{
	g_x++;
	return 0;
}

DWORD CALLBACK ThreadFunc2( LPVOID lpVoid )
{
	g_x++;
	return 0;
}
咋一看感覺沒有什麼問題,兩個線程函數結束之後g_x爲2,但是,有個問題是我們不能知道確切的時候線程在做什麼,我們不能知道操作系統什麼時候把線程切換掉,所以我只能說g_x結果可能爲2,,假設將上面函數代碼編譯成了下面的彙編代碼:
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
此時將得到正確的結果,但是當一個線程執行到一半的時候,系統切換到另一個線程則可能的代碼將如下:
MOV EAX, [g_x]
INC EAX

MOV EAX, [g_x]
INC EAX
MOV [g_x], EAX

MOV [g_x], EAX
此時g_x結果將爲1,所以我們應該保持線程的同步,在同一時刻保證只有一個線程訪問共享資源,操作系統給我們提供了兩種方法,一種是在用戶模式下進行線程同步,另一種是在內核模式下進行線程同步。
我將會在之後博文中分別介紹。

2. 什麼時候需要線程同步

以下兩種基本情況下,線程之間需要相互通信,保持同步:
  • 需要讓多個線程同時訪問一個共享資源,同時不能破壞資源的完整性。
  • 一個線程需要通知其他線程某項任務已經完成。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章