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;
}
相关文章
相关标签/搜索