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

(2)在SellTicketTest.cpp开头中引入头文件。

#include "afxmt.h"

添加两个变量:

int gticketId = 10;  //记录卖出的车票号
CCriticalSection gcs; // 定义CCriticalSection对象

(3)创建两个工作线程,然后主线程等待它们执行完毕,线程函数中,每当要卖票了,就先Lock,卖完票后再Unlock。
(4)在int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])中添加如下代码:

CWinThread *pwinthread1, *pwinthread2;

在else中添加如下代码:

            puts("利用CCriticalSection同步线程");pwinthread1 = AfxBeginThread(threadfunc, (LPVOID)0);pwinthread2 = AfxBeginThread(threadfunc, (LPVOID)1);WaitForSingleObject(pwinthread1->m_hThread, INFINITE); //等待线程结束WaitForSingleObject((HANDLE)pwinthread2->m_hThread, INFINITE); //等待线程结束puts("卖票结束");

(5)在_tmain函数的前面添加如下代码:

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

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

单独使用CCriticalSection对象来同步线程相关推荐

  1. 联合使用类CCriticalSection和类CSingleLock同步线程

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

  2. Windows核心编程 第九章 线程与内核对象的同步(下)

    9.4 等待定时器内核对象 等待定时器是在某个时间或按规定的间隔时间发出自己的信号通知的内核对象.它们通常用来在某个时间执行某个操作. 若要创建等待定时器,只需要调用C r e a t e Wa i ...

  3. Windows核心编程 第九章 线程与内核对象的同步(上)

    第9章 线程与内核对象的同步 上一章介绍了如何使用允许线程保留在用户方式中的机制来实现线程同步的方法.用户方式同步的优点是它的同步速度非常快.如果强调线程的运行速度,那么首先应该确定用户方式的线程同步 ...

  4. 线程与内核对象的同步——Windows核心编程学习手札之九

    线程与内核对象的同步 --Windows核心编程学习手札之九 用户方式下的线程同步机制具有速度快的特点,但有其局限性,对于许多应用程序来说,并不合适.例如,互锁函数家族只能在单值上运行,根本无法使线程 ...

  5. Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信

    前几篇: Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-线程本地Th ...

  6. Python | threading03 - 使用条件对象,实现线程间的同步

    文章目录 一.前言 二.生产者-消费者的模型 2.1.代码 2.2.运行 2.3.wait( )方法会将互斥锁释放 三.条件同步 - threading.Condition( ) 3.1.相关API ...

  7. DirectX12(D3D12)基础教程(十六)——实现渲染线程池:3个内核同步对象实现渲染线程池/大规模线程池

    文章目录 1.前言 2.深入了解MsgWaitForMultipleObjects()函数fWaitAll参数为TRUE时的问题 3.内核同步对象:CPU线程屏障(CPU Barrier)基础知识 4 ...

  8. 线程与内核对象的同步-2

    等待定时器内核事件 CreateWaitableTimer( PSECURITY_ATTRIBUTES psa, BOOL fManualReset, PCTSTR pszName); 进程可以获得它 ...

  9. 同步线程和进程间的通信

    最近回去学习了一下进程和进程间的通信,有时候很多东西久不看了也就一下子忘了== 这里面有好几个互斥对象使用线程的 1 void mListText(CString str) 2 { 3 m_list_ ...

最新文章

  1. linux启动服务器ftp监听,Linux redhat6.5开启ftp服务
  2. javascript 获取光标所选中的内容并插入到另一个文本框中(兼容ie和ff)
  3. 记一次CTF实验吧的代码审计
  4. 指定某行复制多次的方法
  5. Kylin安装,Kylin网页版教程学习
  6. ORACLE:RETURNING 子句
  7. 用户会话,数据控件和AM池
  8. 2016年10月30日表单标签与样式表分类和选择器
  9. 2017.9.7 JC loves Mkk 失败总结
  10. maven添加jar包依赖
  11. 11 款最好 CSS 框架 让你的网站独领风骚
  12. 大写金额用计算机简单些,大写一到十怎么写 数字一到十的大写怎么写(开票用的大写)...
  13. typroa 思维导图_巧用Markdown和百度脑图
  14. DPC(Defect Point Correction)------坏点校正
  15. SpringBootAdmin超详细教程以及端点指标控制
  16. Python2中文乱码处理
  17. PP-ShiTu 库管理工具使用教程
  18. matlab使用webcam获取摄像头图像
  19. 好程序员分享如何在Java面试中克服恐惧
  20. 【站长之窗第八期】安全卫士——“邪恶八进制”冰血封情

热门文章

  1. 你知道古筝演奏技法的三次革命吗
  2. 不能用主机名访问跨网段的网站服务.
  3. js中的event详解
  4. zookeeper下载安装 window&linux
  5. 分布式追踪与监控:Skywalking
  6. android设置自定义按钮,Android自定义View之元素按钮
  7. 【博弈论】威佐夫博弈
  8. 快手小哥风雨求职路之简历篇
  9. WSL 0x80070003错误处理
  10. 【学习记录】如何使用gdal生成COG+标准TMS切片