zoukankan      html  css  js  c++  java
  • C++线程同步之原子操作

    所谓的原子操作就是指一个线程对于某一个资源做操作的时候能够保证没有其它的线程能够对此资源进行访问。

    原子操作仅仅能够解决某一个变量的问题,只能使得一个整型数据做简单算术运算的时候是原子的。

    以下案例需要在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;
    }
  • 相关阅读:
    Socket通信的理解
    wpf listbox 内的内容显示问题,需要设置里面的itemsPresenter
    C#的两个大方向
    QT的安装和配置及helloqt程序的编写时遇到的问题
    华为交换机基础命令
    华为创建VLAN及VLAN间通讯
    powershell查询AD域账号详细信息
    Powershell从EXCEL导入大量用户
    映射网络驱动器
    域策略更新及导出
  • 原文地址:https://www.cnblogs.com/duxie/p/11072219.html
Copyright © 2011-2022 走看看