关键部分CCriticalSection使用

类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻仅仅同意一个线程存取资源或代码区。临界区在控制一次仅仅有一个线程改动数据或其他的控制资源时很实用。比如,在链表中添加一个结点就仅仅同意一次一个线程进行。通过使用CCriticalSection对象来控制链表,就能够达到这个目的。它就像是一把钥匙,哪个线程获得了它就获得了执行线程的权力,而把其他线程统统堵塞。
CCriticalSection类的构造函数原型例如以下:

CCriticalSection()

能够发现这个类的构造函数没有參数,所以创建一个CCriticalSection类的对象很easy,仅仅有例如以下就可以:

CCriticalSection criticalSection;

演示样例:使用临界段编写一个有两个线程的应用程序。
1.创建单文档应用程序;
2.在视图类的实现文件里定义一个临界段对象:

CCriticalSection criticalSection;

3.在视图类的实现文件里定义两个线程函数:

UINT MessageThread1(LPVOID pParam) 

    criticalSection.Lock(); 
    LPTSTR pMessage = _T("Thread1 is started"); 
    CWnd *pMainWnd = AfxGetMainWnd(); 
    ::MessageBox(pMainWnd->m_hWnd, pMessage, _T("Thread message"), MB_OK); 
    criticalSection.Unlock(); 
    return 0; 

UINT MessageThread2(LPVOID pParam) 

    criticalSection.Lock(); 
    LPTSTR pMessage = _T("Thread2 is started"); 
    CWnd *pMainWnd = AfxGetMainWnd(); 
    ::MessageBox(pMainWnd->m_hWnd, pMessage, _T("Thread message"), MB_OK); 
    criticalSection.Unlock(); 
    return 0; 
}

4.在视图类鼠标左键消息函数编写例如以下:

void CThreadTestView::OnLButtonDown(UINT nFlags, CPoint point) 

    AfxBeginThread(MessageThread1, _T("Thread is started")); //启动线程1 
    AfxBeginThread(MessageThread2, _T("Thread is started")); //启动线程2 
    CView::OnLButtonDown(nFlags, point); 
}

执行结果例如以下:

參考资料:
1.临界段类(CCriticalSection)——MFC http://blog.sina.com.cn/s/blog_627ebfc30100itd9.html
2.《MFC Windows应用程序设计(第2版)》

时间: 2024-08-06 11:41:06

关键部分CCriticalSection使用的相关文章

秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题 在<秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量>中对经典多线程同步互斥问题进行了回顾和总结,这篇文章对Windows系统下常用的线程同步互斥机制——关键段.事件.互斥量.信号量进行了总结.有网友问到互斥量能处理“遗弃”问题,事件和信号量是否也能处理“遗弃”问题.因此本文将对事件和信号量作个试验,看看事件和信号量能否处理“遗弃”问题. 一.

网络电视精灵的框架及关键代码

效果: 编写节目类 属性:播出时间.时段.名称.视频路径 编写频道基类 属性:频道名称.频道节目单位置.节目列表 抽象方法:Fetch() 编写频道子类 继承“频道基类”,实现Fetch()[只写方法声明] 编写频道工厂类 方法:实现创建频道子类 第一步.创建几个类: 01:创建一个电视类(TvProgram) 该类主要负责定义节目的属性,为后续从xml文件(FullChannnels.xml)中读取的内容提供存放位置. 属性为: public DateTime PlayTime { get;

敏捷方法的关键还是设计

快速原型,测试驱动,不断迭代......敏捷作为一种软件项目开发的新方法论,已经被越来越多的人接受,并在实际工作中使用. 敏捷理论中主要应对成熟的程序员面对不太成熟的客户需求时的情况.而在国内,我们经常见到的情况是,一群不成熟的程序员面对一些并不成熟的需求.在这样的情况下,一个有着丰富经验的架构师就显得至关重要.编程本身不难,遵守编码规范也很容易,重构.迭代也是很容易实施的方法,但只有在较为清晰的架构下才能更快地达到目标. 有了优秀的架构师,对普通的程序员在专业知识方面的要求就可以低得多. 找个

聊聊推送的架构及关键技术实现

推送是在日常终端使用场景中经常碰到,特别是移动互联网普及之后,手机终端成为了消息推送的主战场,例如生活服务类的优惠券推送,咨询类的新闻推送,电商类的购物推送等等,在业务用户触达上起到了至关重要的作用,那我们今天就来揭开一下推送这个隐藏在业务背景之下的技术实现 系统架构及模块介绍 这是一个比较完整的推送业务架构图,分为三个部分:业务层.通道层和客户端常驻服务,一般来说客户端常驻服务和通道层维持一个长连接通道实现数据的双向传递,而业务层实现的是基于推送业务形态的展示,例如推送的定时任务推送,接口推送

SQL Server数据库镜像关键性能计数器

SQL Server数据库镜像关键性能计数器 监视数据库镜像基本有以下5种方法: 1. 配置数据库镜像监视器.设置告警阈值. 2. 配置WMI EVENT ALERT,配置镜像状态修改后的动作或告警. 3. 使用系统监视器查看关键性能计数器. 4. 部署作业监控异常镜像状态,发送告警. 5. 使用sp_dbmmonitorresults获取镜像数据. 当然,使用扩展事件和SQL Server Profiler也能监控到数据库事件中的数据库镜像状态修改.这种工具主要用于跟踪,而非监控的常规手段.

InnoDB的三个关键特性

http://www.cnblogs.com/benshan/archive/2013/01/14/2859336.html InnoDB的三个关键特性 InnoDB存储引擎的三个关键特性:插入缓冲(insert buffer).二次写(double write).自适应哈希索引(adaptive hash index). 1.插入缓冲(insert buffer)的原理: 对于非聚集索引的插入和更新,不是每一次直接插入索引页中,而是首先判断插入的非聚集索引页是否在缓冲池中,如果在,则直接插入,

灵修不分地点 体会呼吸和念头最关键

http://cul.sohu.com/s2012/lixinpin/ <做自己的先知>是台湾知名作家李欣频的作品,书中讲述了她在2005年两次印度修行之旅的体验.在第一次为期21日的灵修中,作者详细记述了每一天的修行经历,通过静心.与神对话.与神同行的方式,作者更深地了解了如何成为一个更高层次的自我,理解了宇宙的宏大无限与自体的渺小,从而更能体会活在当下.积极的心向和善待他人的重要意义...[访谈实录全文] 灵修不分地点 体会呼吸和念头最关键 主持人:各位搜狐网友大家好,今天搜狐文化客厅很高

跟着百度学PHP[4]OOP面对对象编程-7-OOP的一些关键子讲解

面对对象常用的一些关键子:http://www.cnblogs.com/xishaonian/p/6146794.html排版不是很好望见谅. THE END 跟着百度学PHP[4]OOP面对对象编程-7-OOP的一些关键子讲解

Java Hotspot G1 GC的一些关键技术

G1 GC,全称Garbage-First Garbage Collector,通过-XX:+UseG1GC参数来启用,作为体验版随着JDK 6u14版本面世,在JDK 7u4版本发行时被正式推出,相信熟悉JVM的同学们都不会对它感到陌生.在JDK 9中,G1被提议设置为默认垃圾收集器(JEP 248).在官网中,是这样描述G1的: The Garbage-First (G1) collector is a server-style garbage collector, targeted for