(1)新建一个控制台工程SellTicketTest2,并在向导的“应用程序设置”中勾选“MFC”。
(2)打开SellTicketTest2.cpp,在开头中引入头文件。

#include "afxmt.h"

(3)添加变量:

int gticketId = 10;  //记录卖出的车票号
CCriticalSection gcs; // 定义CCriticalSection对象
CSingleLock singleLock(&gcs);
CSingleLock singleLock2(&gcs);

(4)创建工作线程函数,代码如下:

UINT  threadfunc(LPVOID param)
{TCHAR chWin;if (param == 0) chWin = _T('甲'); //甲窗口else chWin = _T('乙'); //乙窗口while (1){if (param==0)singleLock.Lock();else singleLock2.Lock();if (gticketId <= 0) //如果车票全部卖出了,则退出循环{if (param == 0)singleLock.Unlock();else singleLock2.Unlock();break;}setlocale(LC_ALL, "chs"); //为控制台设置中文环境_tprintf(_T("%c窗口卖出的车票号 = %d\n"), chWin, gticketId); //打印信息gticketId--;//车票减少一张if (param == 0)singleLock.Unlock();else singleLock2.Unlock();Sleep(1);}return 0;
}

(5)在int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])中添加如下代码:

CWinThread *pwinthread1, *pwinthread2;

在else中添加如下代码:

else{// TODO: 在此处为应用程序的行为编写代码。puts("联合使用类CCriticalSection和类CSingleLock来同步线程");pwinthread1 = AfxBeginThread(threadfunc, (LPVOID)0);pwinthread2 = AfxBeginThread(threadfunc, (LPVOID)1);WaitForSingleObject(pwinthread1->m_hThread, INFINITE); //等待线程结束WaitForSingleObject((HANDLE)pwinthread2->m_hThread, INFINITE); //等待线程结束puts("卖票结束");}

(6)保存工程并按快捷键Ctrl+F5运行,运行结果如图所示:

联合使用类CCriticalSection和类CSingleLock同步线程相关推荐

  1. 邀请函|欢迎参加2019云创大数据实验平台金融类/电子商务类/数学统计类院校各省总代理招募大会!...

    云创大数据将于2019年1月16日(周三)在南京举办"2019云创大数据实验平台金融类/电子商务类/数学统计类院校各省总代理招募大会",欢迎全国各省有意愿成为云创大数据实验平台各省 ...

  2. 单独使用CCriticalSection对象来同步线程

    (1)新建一个控制台工程SellTicketTest,并在向导的"应用程序设置"中勾选"MFC",因为CCriticalSection属于MFC类,如图所示. ...

  3. IO流(六)之CharArrayReader类与CharArrayWriter类

    CharArrayReader类与CharArrayWriter类分别是字符数组输入流和字符数组输出流类.用来进行字符数组输入输出操作. 1.CharArrayReader类 1.1构造器 CharA ...

  4. 并发工具类(四)两个线程进行数据交换的Exchanger

    简介 Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法 ...

  5. C#文件操作基础之File类和FileInfo类

    文件和I/O流的差异: 文件是一些具有永久存储及特定顺序的字节组成的一个有序的.具有名称的集合. 因此对于文件,我们经常想到文件夹路径,磁盘存储,文件和文件夹名等方面. I/O流提供一种后备存储写入字 ...

  6. 【JAVA SE】第十章 String类、StringBuffer类和StringBuilder类

    第十章 String类.StringBuffer类和StringBuilder类 文章目录 第十章 String类.StringBuffer类和StringBuilder类 一.String类 1.创 ...

  7. Python 中的新式类和经典类的区别?

    1. 版本支持 / 写法差异# 在Python 2.x 中 如果你至今使用的还是 Python 2.x,那么你需要了解一下,在Python 2.x中存在着两种类:经典类和新式类. 什么是经典类? Co ...

  8. hibernate 并发获取session失败 空指针_高并发之|通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程...

    核心逻辑概述 ThreadPoolExecutor是Java线程池中最核心的类之一,它能够保证线程池按照正常的业务逻辑执行任务,并通过原子方式更新线程池每个阶段的状态. ThreadPoolExecu ...

  9. 一大波Java来袭(四)String类、StringBuilder类、StringBuffer类对照

    本文主要介绍String类.StringBuffer类.StringBuilder类的差别  : 一.概述 (一)String 字符串常量.可是它具有不可变性,就是一旦创建,对它进行的不论什么改动操作 ...

最新文章

  1. 设计模式之简单工厂模式(静态工厂方法)
  2. python walk_Python os.walk()方法
  3. 摆脱困境:在DbUnit数据集中使用空值
  4. js delete删除对象属性,delete删除不了变量及原型链中的变量
  5. 【数据分析就业实战】——缺失值的常见处理方法
  6. 大信会计师事务所笔试题目_最新会计师事务所排名发布!CPA过两科的有机会了...
  7. asp:boundfield 鼠标悬停后显示_设计了100张图表后,我学到了哪些经验?
  8. (转)SQLServer_十步优化SQL Server中的数据访问 三
  9. 分布式系统原理_分布式系统架构设计 第19式 分布式系统八卦思维模型
  10. 阿里开发者们的第15个感悟:做一款优秀大数据引擎,要找准重点解决的业务场景... 1
  11. echart饼状图上显示百分比
  12. C语言中的EOF是什么?
  13. kaggle TalkingData用户性别数据预测性别入门笔记
  14. python操作word
  15. oracle的sql硬解析和软解析,[ORACLE]oracle SQL执行过程 软解析(soft prase)硬解析(hard prase)以及 Soft Soft Parse...
  16. MAtlab wavefront,MATLAB:像Wavefront算法一样制作矩阵
  17. Java Web入门之JSTL标签的解析及使用(超详细必看)
  18. Eclypse-Z7 + Zmod ADC 1410 基础环境搭建(vivado部分)
  19. 笔记本电脑属于个人计算机吗,黄真真:笔记本电脑属于个人计算机的一种形式莫?...
  20. 华为手机助手安卓版_渲美手机恢复助手安卓版安卓版下载-渲美手机恢复助手安卓版app下载...

热门文章

  1. 解决R语言xlsx安装遇到加载rjava报错的问题
  2. TwinCAT3 PLC多轴编程的方法
  3. python实现k均值聚类(kMeans)基于numpy
  4. 使用阿里EasyExcel实现上传下载、导入导出Excel
  5. JAVA初学者如何实现基于UDP和TCP协议的网络编程
  6. # 2021-01-11 #「GNOME」- 启用系统托盘图标(System Tray)
  7. 网络基础之虚拟局域网(VLAN)基础理论及华为ENSP基础配置
  8. Ubuntu的Python虚拟环境安装
  9. 《鬼谷子本经阴符七术》4分威法伏熊
  10. 编写病人医院看病模拟程序