当前位置:首页 > 编程开发

VC/MFC 临界区使用方法事例

webgou16年前 (2010-09-01)编程开发382

    临界区的作用:避免临界区内的数据(一般为共享的资源)被不同的线程同时访问,实现线程的同步操作。保证只能由先进入临界区的一个线程访问结束后,其他线程才可以继续访问共享的资源。

以下为临界区的使用方法:

*.h头文件:

#include <winbase.h>

CRITICAL_SECTION  m_cs_test; ///< 定义一个临界区对象

*.cpp源文件使用方法:

在类的构造函数内初始化临界区对象

//该函数必须在任何线程调用EnterCriticalSection函数之前被调用,否则结果将是很难预计的

::InitializeCriticalSection(&m_cs_test);

 

在类的虚构函数内释放临界区对象

::DeleteCriticalSection(&m_cs_test);

 

使用方法一:

在所需要使用的函数中开始锁定:

CCriticalSectionLock lock(m_cs_test);

在函数生命期结束后会自动解锁。

 

使用方法二:

//进入开始锁定数据:保护共享资源只被一个线程调用

EnterCriticalSection(&m_cs_test);

...//do something you want to

//离开锁定的数据:允许共享资源被其他的线程调用

LeaveCriticalSection(&m_cs_test);

 

可以使用下面这个函数来代替EnterCriticalSection

 

BOOL TryEnterCriticalSection(PCRITICAL_SECTION pcs);

TryEnterCriticalSection函数决不允许调用线程进入等待状态。相反,它的返回值能够指明调用线程是否能够获得对资源的访问权。因此,如果TryEnterCriticalSection发现该资源已经被另一个线程访问,它就返回FALSE。在其他所有情况下,它均返回TRUE。

运用这个函数,线程能够迅速查看它是否可以访问某个共享资源,如果不能访问,那么它可以继续执行某些其他操作,而不必进行等待。如果TryEnterCriticalSection函数确实返回了TRUE,那么CRITICAL_SECTION的成员变量已经更新,以便反映出该线程正在访问该资源。因此,对返回TRUE的TryEnterCriticalSection函数的每次调用都必须与对LeaveCriticalSection函数的调用相匹配。

Windows 98没有可以使用的TryEnterCriticalSection函数的实现代码。调用该函数总是返回FALSE。

 

PS:可以定义不同的临界区对象(CRITICAL_SECTION)来锁定不同的共享资源,使用方法就是传递不同的参数对象,如m_cs_test。

来源连接:http://blog.sina.com.cn/s/blog_4b44e1c00100c8qj.html~type=v5_one&label=rela_prevarticle

扫描二维码推送至手机访问。

版权声明:本文由知了博客发布,如需转载请注明出处。

本文链接:https://www.webgou.info/?id=303

标签: vc mfcvc
分享给朋友:

“VC/MFC 临界区使用方法事例” 的相关文章

ios游戏应用上线需要哪些准备?

-˃营销产品 -˃开发产品-˃维护产品 开发所需: 硬件: 1.mac 一台 2.iphone/ipad,其它apple产品是可选的 3.1U服务器一台,以及服务器托管费用 软件: 1.c/s技术,用于应用及后台统计。 2.ios应用开发,类似mfc/qt做界面库的使用 3.游戏类技术积累,现在…

CWND *this

用*this可以获得HWND,经调试得知,运行到的是操作符()函数.等价于: CWND wnd; HWND hWnd = (wnd);…

flex builder 3 debug

安装flex builder 3需要调试,那就需要下载调试的flash player ,并且要跟浏览器相对应的调试版本 。设置先项如下面: [IMG]zb_users/upload/legacy-upload/flexbuilderie.JPG[/IMG]…

[转]Unity琐碎(3) UGUI 图文混排解决方案和优化

 感觉使用Unity之后总能看到各种各样解决混排的方案,只能说明Unity不够体恤下情啊。这篇文章主要讲一下个人在使用过程中方案选择和优化过程,已做记录。顺便提下,开源很多意味着坑,还是要开实际需求。1. 方案选择1 TextMeshProUnity 最近公布收购了TextMeshPro并…

WINCE下如何使用串口!

1.创建线程 //////////////////////////////////////////////////////////////////////////// DWORD CApplicationDlg::CommRecvTread(LPVOID lparam) { DWORD dwLeng…

用HttpClient来模拟浏览器GET POST

一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器,用来浏览页面查看信息或者提交一些数据等等。所访问的这些页面有的仅仅是一些普通的页面,有的需要用户登录后方可使用,或者需要认证以及是一些通过加密方式传输,例如HTTPS。目前我们使用的浏览器处理这些情况都不会构成问题。不过…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。