线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的用法
程序员文章站
2022-05-22 12:46:48
...
原文地址:点击打开链接
开发环境:win7,vs2008
定义一个全局的锁CRITICAL_SECTION的实例和一个静态全局变量。
CRITICAL_SECTION cs;//可以理解为锁定一个资源
static int n_AddValue = 0;//定义一个静态的全部变量n_AddValue
头文件
#include <stdio.h>
#include <afxwin.h>
#include <iostream>
#include <Windows.h>
using namespace std;
创建两个线程函数,代码如下:
//第一个线程
UINT FirstThread(LPVOID lParam)
{
EnterCriticalSection(&cs);//加锁 接下来的代码处理过程中不允许其他线程进行操作,除非遇到LeaveCriticalSection
for(int i = 0; i<10; i++){
n_AddValue ++;
cout << "n_AddValue in FirstThread is "<<n_AddValue <<endl;
}
LeaveCriticalSection(&cs);//解锁 到EnterCriticalSection之间代码资源已经释放了,其他线程可以进行操作
return 0;
}
//第二个线程
UINT SecondThread(LPVOID lParam)
{
EnterCriticalSection(&cs);//加锁
for(int i = 0; i<10; i++){
n_AddValue ++;
cout << "n_AddValue in SecondThread is "<<n_AddValue <<endl;
}
LeaveCriticalSection(&cs);//解锁
return 0;
}
在主函数中添加如下代码:
int nRetCode = 0;
// 初始化 MFC 并在失败时显示错误
InitializeCriticalSection(&cs);//初始化结构CRITICAL_SECTION
CWinThread *pFirstThread,*pSecondThread;//存储函数AfxBeginThread返回的CWinThread指针
pFirstThread = AfxBeginThread(FirstThread,LPVOID(NULL));//启动第一个线程
pSecondThread = AfxBeginThread(SecondThread,LPVOID(NULL));//启动第二个线程
HANDLE hThreadHandle[2];//
hThreadHandle[0] = pFirstThread->m_hThread;
hThreadHandle[1] = pSecondThread->m_hThread;
//等待线程返回
WaitForMultipleObjects(2,hThreadHandle,TRUE,INFINITE);
return nRetCode;
运行结果:
个人认为在函数EnterCriticalSection和LeaveCriticalSection中间的代码执行过程不会被其他线程干拢或者可以表达为不允许其他线程中的代码执行,可以有效防止一个全局变量在两个线程中同时被操作的可能性。