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

在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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值