zoukankan      html  css  js  c++  java
  • 线程安全-临界区

    多个线程有对同一个全局变量进行写的操作时,会出现线程安全问题。

    1,临界区 / 临界资源

    临界资源时一次只允许一个线程使用的资源。

    访问临界资源的那段代码称为临界区。

    临界区实现之线程锁

    如图

    1,创建全局变量,一个全局令牌
    CRITICAL_SECTION cs;//相当于一个令牌,让线程去拿,谁拿到,谁执行代码
    
    2,初始化全局变量
    InitializeCriticalSection(&cs);//初始化令牌
    
    3,实现临界区
    EnterCriticalSection(&cs);
    //to do 使用临界资源
    LeaveCriticalSection(&cs);
    #include <Windows.h>
    
    DWORD global_var;//要在线程中使用的变量,线程会对它有写操作
    CRITICAL_SECTION cs;//相当于一个令牌,让线程去拿,谁拿到,谁执行代码
    
    DWORD WINAPI MyThread1(LPVOID lpParameter)
    {
        DWORD oneCode;
        //ziji de code
        EnterCriticalSection(&cs);
        if(condition(global_var))
        {
            //to do 对 global_var 的写操作
        }
        LeaveCriticalSection(&cs);
        return oneCode;
    }
    DWORD WINAPI MyThread2(LPVOID lpParameter)
    {    DWORD oneCode;
        //ziji de code
        EnterCriticalSection(&cs);
        if(condition(global_var))
        {
            //to do 对 global_var 的写操作
        }
        LeaveCriticalSection(&cs);
        return oneCode;
    }
    
    int main()
    {
        InitializeCriticalSection(&cs);//初始化令牌
        HANDLE hThread1;
        HANDLE hThread2;
        
        hThread1 = CreateThread(NULL,0,MyThread1,NULL,0,NULL);
        hThread2 = CreateThread(NULL,0,MyThread2,NULL,0,NULL);
        
        CloseHandle(hThread1);
        CloseHandle(hThread2);
        return 0;
    }
  • 相关阅读:
    16. Vue 登录存储
    JS 10位、13位时间戳转日期
    14.Vue 定义全局函数
    13.Vue+Element UI实现复制内容
    12.Vue+Element UI 获取input的值
    11.Vue安装Axios及使用
    Layui入手
    MongoDB自启动设置
    sql数据统计
    sql查询总结
  • 原文地址:https://www.cnblogs.com/a-s-m/p/12349986.html
Copyright © 2011-2022 走看看