zoukankan      html  css  js  c++  java
  • 线程同步临界区对象

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




  • 相关阅读:
    React Native 项目常用第三方组件汇总
    react-native-swiper的Github地址
    Navicat for MySQL 使用
    maven项目创7 配置分页插件
    rander()函数执行条件
    RN生命周期
    react-native连接夜神模拟器
    让PHP7达到最高性能的几个Tips
    php安装
    被swoole坑哭的PHP程序员
  • 原文地址:https://www.cnblogs.com/arbboter/p/4225229.html
Copyright © 2011-2022 走看看