zoukankan      html  css  js  c++  java
  • VC/MFC 临界区使用方法事例

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

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

    *.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。

  • 相关阅读:
    基于稀疏表示学习的图像分类
    多个for循环嵌套会影响速度
    LP-KPN
    C++ const
    C++面向对象
    使用最新的“huihui中文语音库”实现文本转语音功能
    后缀crt证书转换
    server2012 配置SSL证书
    解决windows server2012 评估版本过期,系统会自动关机
    Win2008 r2 IIS7.5出现FastCGI进程最近常常失败。请过一会再尝试此请求的解决方法
  • 原文地址:https://www.cnblogs.com/jinsedemaitian/p/5589170.html
Copyright © 2011-2022 走看看