• WinCE下临界区CriticalSection使用


         很多人对CRITICAL_SECTION的理解是错误的,认为CRITICAL_SECTION是锁定了资源,其实,CRITICAL_SECTION是不能够“锁定”资源的,它能够完成的功能,是同步不同线程的代码段。简单说,当一个线程执行了EnterCritialSection之后,cs里面的信息便被修改了,以指明哪一个线程占用了它。而此时,并没有任何资源被“锁定”。不管什么资源,其它线程都还是可以访问的(当然,执行的结果可能是错误的)。只不过,在这个线程尚未执行LeaveCriticalSection之前,其它线程碰到EnterCritialSection语句的话,就会处于等待状态,相当于线程被挂起了。 这种情况下,就起到了保护共享资源的作用。

    WinCE下临界区CriticalSection使用

    临界区(CriticalSection)主要用来线程的同步,使用临界区相对比较简单;其使用的系统API如下:

    一、InitializeCriticalSection

    初始化

    VOID InitializeCriticalSection( LPCRITICAL_SECTION lpCriticalSection);

    本函数初始化临界区资源,在使用前必需调用函数

    二、EnterCriticalSection

    占用临界区

    VOID EnterCriticalSection( LPCRITICAL_SECTION lpCriticalSection );

    在你需要同步的代码前调用本函数来占用临界区

    三、TryEnterCriticalSection

    尝试性占用临界区

    BOOL TryEnterCriticalSection( LPCRITICAL_SECTION lpCriticalSection );

    尝试性地占用临界区,如果此时临界区没被占用,则占用临界区并返回非0值,否则反回0值

    四、LeaveCriticalSection

    释放对临界区的占用

    VOID LeaveCriticalSection ( LPCRITICAL_SECTION lpCriticalSection );

    在你占用临界区并执行完同步代码之后必需调用本函数来释放对临界区的占用

    五、DeleteCriticalSection

    释放临界区资源

    VOID DeleteCriticalSection( LPCRITICAL_SECTION lpCriticalSection );

        在你的程序退出时或在不再使用临界区是调用本函数来释放临界区资源

    使用例子如下:

    1.初始化

    //初始化

    CRITICAL_SECTION  tCri;

    InitializeCriticalSection( &tCri );

    2.占用与释放占用

    //占用与释放占用

    EnterCriticalSection( &tCri );

    //此处为你需要同步的代码

    ……..

    LeaveCriticalSection( &tCri );

    当然此段代码也可以写成如下的样子

    if (TryEnterCriticalSection( &tCri )!=0)

    {

        //此处为你需要同步的代码

        ……..

        LeaveCriticalSection( &tCri );
    }

    当然我们知道TryEnterCriticalSection是不会阻塞你的程序的执行的

    3.释放临界区资源

    DeleteCriticalSection( &tCri );

    转自:http://www.a3gs.com/BookViews.asp?InfoID=2545&classID=800

  • 相关阅读:
    rustlang入门教程
    中间件日志切割
    Redis非关系型缓存数据库集群部署、参数、命令工具
    SaltStack自动化软件简介及安装
    CentOS根目录下各目录介绍
    Dockerfile书写介绍及构建ssh镜像、tomcat镜像、nginx镜像
    DockerFile执行报错解决
    阿里云CentOS7.2把默认语言修改成中文
    JavaScript 如何判断一个数据的类型
    MongoDB windows 下安装配置
  • 原文地址:https://www.cnblogs.com/wenziqi/p/1807464.html
Copyright © 2020-2023  润新知