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); }
时间: 2024-11-06 15:12:29