联合使用类CCriticalSection和类CSingleLock同步线程
(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同步线程相关推荐
- 邀请函|欢迎参加2019云创大数据实验平台金融类/电子商务类/数学统计类院校各省总代理招募大会!...
云创大数据将于2019年1月16日(周三)在南京举办"2019云创大数据实验平台金融类/电子商务类/数学统计类院校各省总代理招募大会",欢迎全国各省有意愿成为云创大数据实验平台各省 ...
- 单独使用CCriticalSection对象来同步线程
(1)新建一个控制台工程SellTicketTest,并在向导的"应用程序设置"中勾选"MFC",因为CCriticalSection属于MFC类,如图所示. ...
- IO流(六)之CharArrayReader类与CharArrayWriter类
CharArrayReader类与CharArrayWriter类分别是字符数组输入流和字符数组输出流类.用来进行字符数组输入输出操作. 1.CharArrayReader类 1.1构造器 CharA ...
- 并发工具类(四)两个线程进行数据交换的Exchanger
简介 Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法 ...
- C#文件操作基础之File类和FileInfo类
文件和I/O流的差异: 文件是一些具有永久存储及特定顺序的字节组成的一个有序的.具有名称的集合. 因此对于文件,我们经常想到文件夹路径,磁盘存储,文件和文件夹名等方面. I/O流提供一种后备存储写入字 ...
- 【JAVA SE】第十章 String类、StringBuffer类和StringBuilder类
第十章 String类.StringBuffer类和StringBuilder类 文章目录 第十章 String类.StringBuffer类和StringBuilder类 一.String类 1.创 ...
- Python 中的新式类和经典类的区别?
1. 版本支持 / 写法差异# 在Python 2.x 中 如果你至今使用的还是 Python 2.x,那么你需要了解一下,在Python 2.x中存在着两种类:经典类和新式类. 什么是经典类? Co ...
- hibernate 并发获取session失败 空指针_高并发之|通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程...
核心逻辑概述 ThreadPoolExecutor是Java线程池中最核心的类之一,它能够保证线程池按照正常的业务逻辑执行任务,并通过原子方式更新线程池每个阶段的状态. ThreadPoolExecu ...
- 一大波Java来袭(四)String类、StringBuilder类、StringBuffer类对照
本文主要介绍String类.StringBuffer类.StringBuilder类的差别 : 一.概述 (一)String 字符串常量.可是它具有不可变性,就是一旦创建,对它进行的不论什么改动操作 ...
最新文章
- 设计模式之简单工厂模式(静态工厂方法)
- python walk_Python os.walk()方法
- 摆脱困境:在DbUnit数据集中使用空值
- js delete删除对象属性,delete删除不了变量及原型链中的变量
- 【数据分析就业实战】——缺失值的常见处理方法
- 大信会计师事务所笔试题目_最新会计师事务所排名发布!CPA过两科的有机会了...
- asp:boundfield 鼠标悬停后显示_设计了100张图表后,我学到了哪些经验?
- (转)SQLServer_十步优化SQL Server中的数据访问 三
- 分布式系统原理_分布式系统架构设计 第19式 分布式系统八卦思维模型
- 阿里开发者们的第15个感悟:做一款优秀大数据引擎,要找准重点解决的业务场景... 1
- echart饼状图上显示百分比
- C语言中的EOF是什么?
- kaggle TalkingData用户性别数据预测性别入门笔记
- python操作word
- oracle的sql硬解析和软解析,[ORACLE]oracle SQL执行过程 软解析(soft prase)硬解析(hard prase)以及 Soft Soft Parse...
- MAtlab wavefront,MATLAB:像Wavefront算法一样制作矩阵
- Java Web入门之JSTL标签的解析及使用(超详细必看)
- Eclypse-Z7 + Zmod ADC 1410 基础环境搭建(vivado部分)
- 笔记本电脑属于个人计算机吗,黄真真:笔记本电脑属于个人计算机的一种形式莫?...
- 华为手机助手安卓版_渲美手机恢复助手安卓版安卓版下载-渲美手机恢复助手安卓版app下载...