mfc c++ 多线程同步 关键性代码段CRITICAL SECTION(二)

来源:互联网 发布:驾校考试预约软件 编辑:程序博客网 时间:2024/05/22 00:13

在mfc多线程,当多个线程都想访问同一个资源时,会导致线程冲突,数据出错,所以在多线程中,当一个线程对共享资源进行操作时,其余线程需要进行等待,当该线程完成操作时,才能占用该资源进行操作。

Critical Section,临界区,就是在线程中执行这样的操作,对关键性代码段进行保护,避免数据混乱。

例子:

int a ,进入线程后进行a++,当多个线程同时运行,进行a++操作时,变量a的数据会变得无序混乱

所以,使用Critical Section对a++进行保护,每次只能一个线程进行a++操作。

代码:

引入
# include “windows.h”

static UINT MarkBtmThread1(LPVOID param11); //声明线程1
static UINT MarkBtmThread2(LPVOID param22); //声明线程2

CRITICAL_SECTION g_Lock; //定义全局变量锁

volatile bool g_bCheckCard1 = true; //设置标志位
volatile bool g_bCheckCard2 = true;

int a =0;

新建按钮事件

void CMSI_VC_DemoDlg::OnBnClickedAutoMark()
{
if(g_bCheckCard1==true)
{
InitializeCriticalSection(&g_Lock); //初始化线程保护结构
AfxBeginThread(MarkBtmThread1,this,THREAD_PRIORITY_HIGHEST);//线程1入口
}
if(g_bCheckCard2==true)
{
InitializeCriticalSection(&g_Lock); //初始化线程保护结构
AfxBeginThread(MarkBtmThread2,this, THREAD_PRIORITY_HIGHEST ); //线程2入口
}
}

UINT CMSI_VC_DemoDlg::MarkBtmThread1(LPVOID param11)
{
CMSI_VC_DemoDlg dlg = (CMSI_VC_DemoDlg)param11;
int iR = GetNextText(); //进入加锁函数

}

UINT CMSI_VC_DemoDlg::MarkBtmThread2(LPVOID param22)
{
CMSI_VC_DemoDlg dlg = (CMSI_VC_DemoDlg)param22;
int iR = GetNextText(); //进入加锁函数
}

int GetNextText() //加锁函数
{
EnterCriticalSection(&g_Lock); //加锁
a++;
LeaveCriticalSection(&g_Lock); //解锁
}

阅读全文
1 0