博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程同步-临界区对象
阅读量:6123 次
发布时间:2019-06-21

本文共 1299 字,大约阅读时间需要 4 分钟。

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

你可能感兴趣的文章
webapp返回上一页 处理
查看>>
新安装的WAMP中phpmyadmin的密码问题
查看>>
20172303 2017-2018-2 《程序设计与数据结构》第5周学习总结
查看>>
eclipse中将一个项目作为library导入另一个项目中
查看>>
Go语言学习(五)----- 数组
查看>>
Android源码学习之观察者模式应用
查看>>
Content Provider的权限
查看>>
416. Partition Equal Subset Sum
查看>>
centos7.0 64位系统安装 nginx
查看>>
数据库运维平台~自动化上线审核需求
查看>>
注解开发
查看>>
如何用 Robotframework 来编写优秀的测试用例
查看>>
Django之FBV与CBV
查看>>
Vue之项目搭建
查看>>
app内部H5测试点总结
查看>>
Docker - 创建支持SSH服务的容器镜像
查看>>
[TC13761]Mutalisk
查看>>
三级菜单
查看>>
Data Wrangling文摘:Non-tidy-data
查看>>
加解密算法、消息摘要、消息认证技术、数字签名与公钥证书
查看>>