windows多线程没那么难

作者:vpoet
mail:vpoet_sir@163.com

上一博文中我们引入了CreateThread()多线程编程一个简单的样例,其实我说windows
多线程没那么难,那是为了安慰你,可是不要怕,困难时让人克服的。

再大的困难也难不

倒英雄的中国程序猿。

以下我又要介绍一个多线程的问题:
我们首先看一个Demo,经典的卖票问题,同一张牌不能卖出去两次:

#include <windows.h>
#include <stdio.h>static int number=20;DWORD WINAPI ThreadOne(LPVOID lpParameter)
{while(1){if(number>0){printf("窗体1售出第%d张票...\n",number);Sleep(1000);number--;}}return 0;
}
DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{while(1){if(number>0){printf("窗体2售出第%d张票...\n",number);Sleep(1000);number--;}}return 0;
}int main()
{HANDLE HOne,HTwo;printf("***********************vpoet******************\n");HOne=CreateThread(NULL,0,ThreadOne,NULL,0,NULL);printf("窗体1售票開始:\n");HTwo=CreateThread(NULL,0,ThreadTwo,NULL,0,NULL);printf("窗体2售票開始:\n");CloseHandle(HOne);CloseHandle(HTwo);while(TRUE){if(number==0){printf("MainThread Over!\n");return 0;}else{continue;} }return 0;
}

执行结果:

看到没,出现了同一张票卖两次的情况,这是绝对错误的。是违反能量守恒定律的。
这是为什么呢。由于我们对全局变量操作两个线程在同一时候进行,假设在窗体1线程的number++
之前,窗体2线程取出了number这时的number还并未自加,所以出现了同一张票
卖两次的情况

那么我们就要用线程同步的方法来控制,怎么控制呢,在windows下控制
多线程同步一般有几种方法:临界区对象,事件对象和相互排斥对象以及锁
以下主要介绍临界区对象进行线程同步:



在win API中:


该函数为初始化临界区函数,參数为临界区对象




该函数等待指定的临界区对象的全部权,当获取指定的临界区对象的全部权之后该函数返回
其參数为临界区对象指针



该函数释放指定临界区对象的全部权,參数为临界区对象指针




该函数为删除释放临界区对象资源






那么接下来我们将用临界区对程序进行改写:
#include <windows.h>
#include <stdio.h>static int number=10;
CRITICAL_SECTION Section;DWORD WINAPI ThreadOne(LPVOID lpParameter)
{while(1){EnterCriticalSection(&Section);if(number>0){printf("窗体1售出第%d张票...\n",number);number--;Sleep(1000);       }LeaveCriticalSection(&Section);}return 0;
}
DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{while(1){EnterCriticalSection(&Section);if(number>0){printf("窗体2售出第%d张票...\n",number);Sleep(1000);number--;}LeaveCriticalSection(&Section);}return 0;
}int main()
{HANDLE HOne,HTwo;InitializeCriticalSection(&Section);printf("***********************vpoet******************\n");HOne=CreateThread(NULL,0,ThreadOne,NULL,0,NULL);printf("窗体1售票開始:\n");HTwo=CreateThread(NULL,0,ThreadTwo,NULL,0,NULL);printf("窗体2售票開始:\n");CloseHandle(HOne);CloseHandle(HTwo);while(TRUE){if(number==0){printf("不好意思,票卖完了!\n");DeleteCriticalSection(&Section);return 0;}else{continue;}   }return 0;
}

执行结果例如以下:

这下票卖对了吧。

好了,Only stop here!
以下的博文我将介绍其它几种线程同步的方法。

转载于:https://www.cnblogs.com/claireyuancy/p/6895012.html

windows多线程没那么难相关推荐

  1. 职场5年经验的工程师论述linux真没那么难

    2019独角兽企业重金招聘Python工程师标准>>> 职场5年经验的工程师论述linux真没那么难 在当前IT界爆炸的时代,不人少人转向了这一行业,尤其是当前大数据,人工智能的流行 ...

  2. 《零基础看得懂的C语言入门教程 》——(二)C语言没那么难简单开发带你了解流程

    一.学习目标 了解DevC集成开发环境 了解集成开发环境 了解HelloWorld程序 了解HelloWorld程序的编写方法 目录 C语言真的很难吗?那是你没看这张图,化整为零轻松学习C语言. 第一 ...

  3. 在疫情震中,哥大AI博士回顾五年CV研究生涯:没那么简单,没那么难...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨Showthem@知乎(已授权) 编辑丨AI科技评论 「开始写这边总结的时候是三月,纽约成了疫情 ...

  4. Solidworks安装失败,出现内部错误:该产品组件的windows installer没按预期运

    安装中注意有两个雷,建议在安装之前就做以下操作!!防止报错了再返工浪费时间.. 第1个是安装时出现以下错误: 这个表示之前其他软件装过Microsoft C++ xxxx Redistributabl ...

  5. Windows多线程编程总结

    Windows 多线程编程总结 keyword:多线程 线程同步 线程池 内核对象 1 内核对象 1 .1 内核对象的概念 内核对象是内核分配的一个内存块,这样的内存块是一个数据结构,表示内核对象的各 ...

  6. windows多线程同步--临界区

    推荐参考博客:秒杀多线程第五篇 经典线程同步 关键段CS 关于临界区的观念,一般操作系统书上面都有. 适用范围:它只能同步一个进程中的线程,不能跨进程同步.一般用它来做单个进程内的代码快同步,效率比较 ...

  7. sr锁存器 数电_数电课设其实也没那么难2.1

    1 引言 如上就是 课题二.数字式抢答器 课题三.多路彩灯控制器 相比天天在路口见的红绿灯 这俩题可能抽象了一点 我自己是课题三 做的时候发现 这题还真不是最简单的一个... 一步一步来吧 数电并不是 ...

  8. O2O防刷单并没那么难,看完这个你也会反作弊了

    前几日传出滴滴快的联合京沪警方打击刷单,什么情况?刷单都到了需要动用警力的地步了?有实力补贴没能力防刷? 今天就要八一八刷单那些事儿,看清楚这里不是传授刷单秘籍,也不是xx天xxx万的运营干货,从产品 ...

  9. windows多线程同步互斥--总结

    2019独角兽企业重金招聘Python工程师标准>>> 秒杀多线程面试题系列 参考JustDoIT -- 大部分内容 <Windows核心编程>线程同步对象速查表 对象 ...

  10. 学会使用楼宇控制系统BACnet网关没那么难

    其实有依然有很多用户(可能是接触不久时间关系,又或者是术业有专攻的关系)对网关的定义不明确.我见过太多用户拿着一个不知道什么参数的参数来问要网关, 我说要什么协议的,却一头雾水.网关说白了就是个协议转 ...

最新文章

  1. GS01创建信息集及其他GROUP在ABAP程序中的调用方法
  2. NIO和BIO如何影响应用程序的设计
  3. 微软私有云分享(R2)16PowerShell查看虚拟机信息
  4. 中间件静态文件服务器,从koa-static中间件学习搭建静态文件服务器
  5. ubuntu16.04下安装配置caffe2和detectron(亲测有效,非常简单)
  6. 高手也不好当,压力更大
  7. 安拆网:脚手架钢管规格及施工要求
  8. C#Winform预览PDF
  9. 怎样任意裁剪图片?如何快速改变图片形状?
  10. python的list的基本操作、list循环、切片、字典基本操作、字典嵌套、字符串常用方法...
  11. android 屏幕分辨率获取,Android获取屏幕分辨率的三种方法
  12. 构建自己的Linux 之三 初步完善(提供网络功能等)
  13. 【 MATLAB 】gca 介绍(当前轴或图表)
  14. 神经网络处理表格数据,神经网络如何识别图像
  15. web工程的权限管理
  16. PHICH介绍(1)
  17. “四大发明”活字印刷当排首位!
  18. 如何使用Endnote修改参考文献格式,自定义参考文献样式
  19. 新能源行业供应链管理平台构建一站式新能源供应链交易闭环
  20. 226款H5手机端小游戏源码下载 - HTML+JavaScript开发的网页小游戏开源源码大合集,经过亲测可用!

热门文章

  1. c:foreach中varStatus参数的含义
  2. Java网络编程之UDP
  3. 软件公司产品营销大数据分析(上)
  4. Docker系列(五)实战:在容器中部署静态网站
  5. 【转】详解GAN代码之逐行解析GAN代码
  6. What's New in Qt 5.5 5.4,以及5.5 所有module
  7. sql 同步2个表中的一个字段数据
  8. git学习中遇到的疑难杂症
  9. 【转】C语言条件编译及编译预处理阶段
  10. opencv学习之路(9)、对比度亮度调整与通道分离