线程安全-临界区

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

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;
}

 

posted @ 2020-02-23 15:27  AGB  阅读(232)  评论(0编辑  收藏  举报