• 线程同步临界区对象


    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);
    }




  • 相关阅读:
    No.7 selenium学习之路之Alert弹窗
    SQLAlchemy
    flask之wtforms
    Django中的信号及其用法
    Flask进阶
    Flask入门
    Django知识点总结
    登录验证随机验证码的实现
    Django之session与分页
    Django之Form组件
  • 原文地址:https://www.cnblogs.com/arbboter/p/4225229.html
Copyright © 2020-2023  润新知