VC 线程同步实例

本文介绍如何使用MFC中的CCriticalSection类和Windows事件内核对象实现线程间的同步处理。通过两个示例展示了如何保护共享资源免受并发修改,并确保线程间的正确同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.MFC为临界区提供有一个CCriticalSection类,使用该类进行线程同步处理是非常简单的,只需在线程函数中使用CCriticalSection类成员函数Lock()和UnLock()标定出被保护代码片段即可。使用CCriticalSection类实现同步代码如下:

//MFC临界区类对象

CCriticalSection g_clsCriticalSection;

//共享资源

char g_cArray[10];

UINT ThreadProc20(LPVOID pParam)

{

//进入临界区

g_clsCriticalSection.Lock();

//对共享资源进行写入操作

for(int i=0; i<10;i++)

{

 g_cArray[i] = 'a';

Sleep(1);

}

//离开临界区

g_clsCriticalSection.Unlock();

return 0;

}

 

UINT ThreadProc21(LPVOID pParam)

{

//进入临界区

g_clsCriticalSection.Lock();

//对共享资源进行写入操作

for(int i=0; i<10;i++)

{

g_cArray[10-i-1] = 'b';

Sleep(1);

}

//离开临界区

g_clsCriticalSection.Unlock();

return 0;

}

 

//创建线程调用

void CSample08View::OnCriticalSectionMFC()

{

//启动线程

AfxBeginThread(ThreadProc20,NULL);

AfxBeginThread(ThreadProc21,NULL);

//等待继续按完毕

Sleep(300);

//报告计算结果

CString sResult = CString(g_cArray);

AfxMessageBox(sResult);

}

 

2.使用事件内核对象来实现线程同步 CreateEvent

//事件句柄

HANDLE hEvent = NULL;

//共享资源

char g_cArray[10];

UINT ThreadProc20(LPVOID pParam)

{

//等待事件置位

WaitForSingleObject(hEvent,INFINITE);

//对共享资源进行写入操作

for(int i=0; i<10;i++)

{

g_cArray[i] = 'a';

Sleep(1);

}

//处理完成后即将事件对象置位

SetEvent(hEvent);

return 0;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值