admin管理员组文章数量:1565292
在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); //解锁
}
版权声明:本文标题:mfc c++ 多线程同步 关键性代码段CRITICAL SECTION(二) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1726271391a1063871.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论