线程同步-临界区对象

1、临界区对象

临界区是保证在某一个时间只有一个线程可以访问数据的方法。使用它的过程中,需要给各个线程提供一个共享的临界区对象,无论哪个线程占有临界区对象,都可以访问受到保护的数据,这时候其它的线程需要等待,直到该线程释放临界区对象为止,临界区被释放后,另外的线程可以强占这个临界区,以便访问共享的数据。

2、主要的函数方法

InitializeCriticalSection(&cs);//初始化临界区 
EnterCriticalSection(&cs);//进入临界区 
LeaveCriticalSection(&cs);//离开临界区 
DeleteCriticalSection(&cs);//删除临界区


3、代码示例
全局变量声明:

int g_count1 = 0;
int g_count2 = 0;
BOOL g_bContinue = FALSE;

CRITICAL_SECTION g_cs;

线程处理函数:
UINT _stdcall ThreadFunc(LPVOID)//线程处理函数
{
	::EnterCriticalSection(&g_cs);//进入
	while( g_bContinue )
	{
		g_count1++;
		g_count2++;
	}
	::LeaveCriticalSection(&g_cs);//离开
	return 0;
}
调用函数:

void CMultiThreadSyncDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	g_count1 = g_count2 = 0;
	::InitializeCriticalSection(&g_cs);//初始化 
	//g_sync_flag = FLAG_CRITICAL;
	g_bContinue = TRUE;
	UINT uId;
	HANDLE h[2];
	h[0] = (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &uId );
	h[1] = (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &uId );
	//等待
	Sleep(1000);
	g_bContinue = FALSE;
	::WaitForMultipleObjects(2, h, TRUE, INFINITE);
	::CloseHandle(h[0]);
	::CloseHandle(h[1]);
	::DeleteCriticalSection(&g_cs);//删除 
	//CString str;
	//str.Format( _T("g_count1 = %d\r\ng_count2 = %d\r\n"),g_count1, g_count2);
	//m_fact.SetWindowText(str);
}




转载于:https://www.cnblogs.com/arbboter/archive/2012/10/20/4225229.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值