线程同步临界区对象

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/p/4225229.html