多个线程有对同一个全局变量进行写的操作时,会出现线程安全问题。
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; }