Windows API一日一练(46)EnterCriticalSection和LeaveCriticalSection函数

原创 2007年10月09日 20:50:00
多个线程操作相同的数据时,一般是需要按顺序访问的,否则会引导数据错乱,无法控制数据,变成随机变量。为解决这个问题,就需要引入互斥变量,让每个线程都按顺序地访问变量。这样就需要使用EnterCriticalSectionLeaveCriticalSection函数。
 
函数EnterCriticalSectionLeaveCriticalSection声明如下:
 
WINBASEAPI
VOID
WINAPI
EnterCriticalSection(
    __inout LPCRITICAL_SECTION lpCriticalSection
    );
   
WINBASEAPI
VOID
WINAPI
LeaveCriticalSection(
    __inout LPCRITICAL_SECTION lpCriticalSection
    );
 
lpCriticalSection是创建临界区对象。
 
调用函数的例子如下:
#001 CCaiWinMsg::CCaiWinMsg(void)
#002 {
#003   m_hBtn = NULL;
#004   m_nCount = 0;
#005 
#006   m_pThreadA = NULL;
#007   m_pThreadB = NULL;
#008 
#009  //
#010  InitializeCriticalSection(&m_csCount);
#011 
#012 }
#013 
#014 CCaiWinMsg::~CCaiWinMsg(void)
#015 {
#016  DeleteCriticalSection(&m_csCount);
#017 }
#018 
 
10行是创建临界区对象。
16行是删除临界区对象。
 
#001 //
#002 //窗口的消息处理类。
#003 //蔡军生 2007/08/13
#004 //
#005 class CCaiWinMsg :
#006  public CCaiWin
#007 {
#008 public:
#009  CCaiWinMsg(void);
#010  virtual ~CCaiWinMsg(void);
#011 
#012  //线程操作函数。
#013  int AddCount(void)
#014  {
#015         //
#016         EnterCriticalSection(&m_csCount);
#017         int nRet = m_nCount++;
#018         LeaveCriticalSection(&m_csCount);
#019 
#020         return nRet;
#021  }
 
在函数AddCount里调用EnterCriticalSectionLeaveCriticalSection来互斥访问变量m_nCount。通过上面这种方法,就可以实现多线程按顺序地访问相同的变量。
 
 
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/caimouse/article/details/1817413

WaitForSingleObject 与 EnterCriticalSection 性能比较

摘要 在 Microsoft Windows 平台上有几种以原子方式锁定代码和数据的不同方法。此白皮书的主要目的是向开发人员简要介绍 Windows 中进行锁定的不同方法以及与这些锁定有关的相应性能...
  • woshinia
  • woshinia
  • 2012-07-05 12:33:13
  • 5640

windows critical section (关键段)

不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。每个线程中访问临界资源的那段代码称为临界区(Critical Section)。  每个线程中访问临界资源的那段程序称为临界区(C...
  • zicheng_lin
  • zicheng_lin
  • 2011-06-30 23:57:00
  • 2714

windows boost::asio 之 EnterCriticalSection(&crit_section_) 错误

错误图如下: 是不是对这个问题感到无可奈何,是不是在骂这sb玩意儿...当然,可能也只有我一个人有这个问题... 下面公布答案 下 下 下 下 下 下 ...
  • oiooooio
  • oiooooio
  • 2015-09-11 10:18:34
  • 739

Windows API一日一练TXT版

  • 2010年04月09日 09:04
  • 59KB
  • 下载

Windows API 一日一练

  • 2010年04月17日 08:39
  • 1.63MB
  • 下载

Windows API一日一练(46)EnterCriticalSection和LeaveCriticalSection函数

多个线程操作相同的数据时,一般是需要按顺序访问的,否则会引导数据错乱,无法控制数据,变成随机变量。为解决这个问题,就需要引入互斥变量,让每个线程都按顺序地访问变量。这样就需要使用EnterCritic...
  • caimouse
  • caimouse
  • 2007-10-09 20:50:00
  • 11794

EnterCriticalSection 和 TryEnterCriticalSection

如果EnterCriticalSection将一个线程置于等待状态,那么该线程在很长时间内就不能再次被调度。实际上,在编写得不好的应用程序中,该线程永远不会再次被赋予CPU时间。TryEnterCri...
  • whatday
  • whatday
  • 2015-07-17 16:45:36
  • 2696

API函数一日一练pdf

  • 2010年07月14日 09:43
  • 1.63MB
  • 下载

对于EnterCriticalSection和LeaveCriticalSection的理解和用法

线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的用法 注:使用结构CRITICAL_SECTION 需加入头文件#include “afxmt.h...
  • qq_24637797
  • qq_24637797
  • 2015-08-26 11:58:08
  • 4217

EnterCriticalSection崩溃

使用EnterCriticalSection函数,同样一个应该程序在有的机器上运行流畅没任何问题,而在有些同样配置的机器上却不能够启动应用程序 刚开启变自动退出了,经过调试发现是在EnterCrit...
  • liuruiying123
  • liuruiying123
  • 2013-11-29 13:10:24
  • 2442
收藏助手
不良信息举报
您举报文章:Windows API一日一练(46)EnterCriticalSection和LeaveCriticalSection函数
举报原因:
原因补充:

(最多只允许输入30个字)