04原子操作
阿新 • • 發佈:2018-08-04
+++ include cow DDM num vdp ++ vum 如果
Windows 多線程之原子操作
1. 原子操作
? 一個操作如果能夠不受中斷地完成,我們稱之為原子操作。
#include <Windows.h> #include <stdio.h> const unsigned int THREAD_NUM = 100; unsigned int g_Count = 0; DWORD WINAPI ThreadFunc(LPVOID); int main() { HANDLE hThread[THREAD_NUM]; for (int i = 0; i < THREAD_NUM; i++) { hThread[i] = CreateThread(NULL, 0, ThreadFunc, 0, 0, NULL); // 創建線程 Sleep(10); } WaitForMultipleObjects(THREAD_NUM, hThread, true, INFINITE); //一直等待,直到所有子線程全部返回 printf(" 總共 %d 個線程給 g_Count 的值加一,現在 g_Count = %d\n", THREAD_NUM, g_Count); return 0; } DWORD WINAPI ThreadFunc(LPVOID p) { Sleep(100); g_Count++; return 0; }
執行結果如下:
? 這裏明明有 100 個線程,每個線程中對全局變量 g_Count 都加 1,結果應該是 100 才對,但是為什麽是 94 呢?問題的根源在與 g_Count++; 這條語句上,在程序執行過程中,其實這一條語句被轉換成三條匯編指令。如果在這三條匯編語句執行過程中發生了線程切換,這就容易造成某次的遞加沒有真正被執行,所有最終的結果就成了 94。
? 因此在多線程環境中對一個變量進行讀寫時,我們需要有一種方法保證對一個值的遞增操作時原子操作 —— 即這個操作不可以被打斷,一個線程在執行原子操作時,其他線程必須等待它完成之後才能開始執行該原子操作。
04原子操作