1. 程式人生 > >04原子操作

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原子操作