C++線程同步之原子操做

所謂的原子操做就是指一個線程對於某一個資源作操做的時候可以保證沒有其它的線程可以對此資源進行訪問。ios

原子操做僅僅可以解決某一個變量的問題,只能使得一個整型數據作簡單算術運算的時候是原子的。windows

如下案例須要在Debug模式下測試。函數

#include<iostream>
#include<windows.h>
using namespace std;

long g_num;

DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
    // InterlockedExchangeAdd 爲一個整型變量以原子方式加上一個數
    // InterlockedExchange 將一個32位數以原子方式賦值給另一個數
    // InterlockedExchange64 將一個64位數以原子方式賦值給另一個數
    // InterlockedCompareExchange 若是兩個數相等,就將另外一個數賦值,不相等無效果

    for (int i = 0; i < 100000; i++)
    {
        // InterlockedIncrement 給一個整形變量自增1
        InterlockedIncrement(&g_num);
        // g_num++;
    }
    return 0;
}

DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{
    for (int i = 0; i < 100000; i++)
    {
        // InterlockedIncrement 給一個整形變量自增1
        InterlockedIncrement(&g_num);
        // g_num++;
    }
    return 0;
}

int main()
{
    HANDLE hThread1 = NULL;
    HANDLE hThread2 = NULL;
    hThread1 = CreateThread(0, 0, ThreadProc1, 0, 0, 0);
    hThread2 = CreateThread(0, 0, ThreadProc2, 0, 0, 0);
    // WaitForSingleObject 叫作等待函數,他可以等待線程結束,線程結束這個函數纔會返回(或者時間到了)不然就阻塞住。
    WaitForSingleObject(hThread1, -1);
    WaitForSingleObject(hThread2, -1);
    cout << "g_num = " << g_num << endl;
    getchar();
    return 0;
}
相關文章
相關標籤/搜索