关于C++多线程实例
引用自https://www.cnblogs.com/codingmengmeng/p/5913068.html的C++多线程入门实例
首先是最初实例代码:

#include <iostream>
#include <windows.h>
using namespace std;DWORD WINAPI Fun(LPVOID lpParamter)    //自定义线程
{for (int i = 0; i < 10; i++)   //定义执行次数cout << "A Thread Fun Display!" << endl;   //定义输出内容return 0L;
}int main()    //主线程
{HANDLE hThread = CreateThread(NULL, 0, Fun, NULL, 0, NULL);CloseHandle(hThread);for (int i = 0; i < 10; i++)    //执行次数cout << "Main Thread Display!" << endl;return 0;
}

运行结果如下:

从代码运行结果来看,主线程(main函数)和我们自己的线程(Fun函数)是随机交替执行的,同时从第二次运行结果会发现一个问题,即"A Thread Fun Display!"并没有输出达到十次,也就是说我们自定义的函数并没有执行足够的次数。这是因为主线程运行完之后将所占资源都释放掉了,使得子线程还没有运行完。
同时,我们会发现一个现象,即在输出结果上,换行操作执行的很凌乱没规律,理论上讲应该是一次输出一次换行,然而这里出现了不换行和连续换行的现象。
用我们学过的知识可以来解释:把屏幕看成是一个资源,这个资源被两个线程所共用,加入当Fun函数输出了Fun Display!后,将要输出endl,但此时,main函数却得到了运行的机会,此时Fun函数还没有来得及输出换行(时间片用完),就把CPU让给了main函数,而这时main函数就直接在Fun Display!后输出Main Display!。
另一种情况就是“输出两个换行”,这种情况就是比如输出Main Display!并输出endl后,时间片用完,轮到子线程占用CPU,子进程上一次时间片用完时停在了Fun Display!,下一次时间片过来时,刚好开始输出endl,此时就会“输出两个换行”。
那么,想要实现正常的输出情况,就可以用互斥来解决。
实例代码2:

#include <iostream>
#include <windows.h>
using namespace std;HANDLE hMutex = NULL;          //互斥信号量
DWORD WINAPI Fun(LPVOID lpParamter)      //线程函数
{for (int i = 0; i < 10; i++)     //定义输出次数{//请求一个互斥信号量WaitForSingleObject(hMutex, INFINITE);cout << "A Thread Fun Display!" << endl;Sleep(100);//释放互斥量锁ReleaseMutex(hMutex);}return 0L;//表示返回的是long型的0}int main()
{//创建一个子线程HANDLE hThread = CreateThread(NULL, 0, Fun, NULL, 0, NULL);hMutex = CreateMutex(NULL, FALSE,"screen");//关闭线程CloseHandle(hThread);//主线程的执行路径for (int i = 0; i < 10; i++){//请求获得一个互斥信号量WaitForSingleObject(hMutex,INFINITE);cout << "Main Thread Display!" << endl;Sleep(100);//释放互斥信号量ReleaseMutex(hMutex);}return 0;
}

代码实现:

计算机操作系统感悟随笔--实例思考相关推荐

  1. 计算机操作系统感悟随笔--声明

    声明 此次博客用于学习计算机操作系统一课的感悟随笔. 内容涉及笔记,实例题讨论.

  2. 计算机操作系统感悟随笔--引论

    OS引论笔记 1.操作系统的目标 方便性.有效性.可扩充性和开放性 2. 使用计算机三种方式 图形窗口方式.命令.系统调用 3.操作系统作用 ①OS作为用户与计算机硬件系统之间的接口 ②OS作为计算机 ...

  3. 计算机操作系统感悟随笔--内存空间管理

    1.单一连续分配 内存分为系统区和用户区两部分: 系统区:仅提供给OS使用,通常放在内存低址部分 用户区:除系统区以外的全部内存空间,提供给用户使用. 最简单的一种存储管理方式,只能用于单用户.单任务 ...

  4. 计算机操作系统感悟随笔--进程通信

    一.进程通信是指进程之间的信息交换 1.低级通信--进程之间的互斥和同步 信号量机制是有效的同步工具,但作为通信工具缺点如下: (1)效率低(通信量少) (2)通信对用户不透明(程序员实现,操作系统只 ...

  5. 计算机操作系统感悟随笔--经典同步问题

    ** 1.生产者-消费者问题(The proceducer – consumer problem:多个生产者和消费者对n个缓冲区的使用.) ** 1.无论生产者.消费者使用缓冲池时应保证互斥使用(互斥 ...

  6. 计算机操作系统感悟随笔--虚拟存储管理

    一.虚拟存储器的基本概念 分析常规存储器管理不足的原因: 1)常规存储器管理方式的特征 一次性:作业在运行前一次性地全部装入内存 驻留性:作业装入内存后,便一直驻留在内存中,直至作业运行结束. 一次性 ...

  7. 计算机操作系统感悟随笔--进程描述与控制

    进程描述与控制 1.前趋图 指一个有向无循环图,用于描述进程之间执行的先后顺序 2.程序顺序执行时的特征 (1) 顺序性 处理机的操作严格按程序规定顺序执行 (2) 封闭性 程序一旦开始执行,其计算结 ...

  8. 计算机操作系统感悟随笔--程序编译连接

    高速缓存 一种速度比内存快的存储设备,一般同寄存器一样集成在CPU中. 存放内存的部分拷贝,把常用的数据放这里可以提高速度. 将短时间内经常访问的部分数据从内存放到高速缓存中,减少CPU访问内存的时间 ...

  9. 计算机操作系统感悟随笔--文件和文件系统

    一.文件和文件系统 文件管理:把所管理的程序和数据组织成一系列的文件,并能进行合理的存储.使用等操作. 1 )基本概念 数据项:描述对象某种属性的字符集:是数据组织中可以命名的最小逻辑数据单位. 记录 ...

最新文章

  1. php 自加 性能,对于数据库的自增、自减心得
  2. 微信为什么不丢消息?
  3. ASP.Net 管道模型 VS Asp.Net Core 管道 总结
  4. Leetcode 16. 最接近的三数之和(3Sum Closest)
  5. 深入解读Flink资源管理机制
  6. setGeometry: Unable to set geometry 493x379+674+326 (frame: 517x443+662+274) on QWidgetWindow/“Dialo
  7. 《剑指offer》第五十三题(数组中数值和下标相等的元素)
  8. 30个超实用Python代码片段
  9. 我想牵你的手,从心动到古稀
  10. Win10没有Realtek高清晰音频管理器怎么办?
  11. 外贸常用术语_外贸常用术语总结.doc
  12. 《SpringSecurity in Action》四:Session共享下的Session并发控制问题
  13. SOLIDWORKS 2014官方正版功能介绍
  14. 一阶RC低通滤波电路数字化
  15. 文件操作之特殊文件操作
  16. 昨日关注:唐骏说盛大、微软、比尔盖茨及营销
  17. 复指数信号的matlab,复指数函数周期怎么算,为什么复变指数函数是周期函数,而实变指...
  18. 对APISIX相关组件,插件的理解说明
  19. 洛谷 P1948 [USACO08JAN]电话线Telephone Lines【NOIP模拟笨笨的电话线】
  20. mini-MBA学习总结一:建设高效团队和决策与执行

热门文章

  1. 视频识别之PC版车牌识别sdk
  2. 老丁带你学USB-解疑2:USB协议中的ACK、NAK、STALL三种返回包含义
  3. 自动化运维:让IT运营更智能,更高效
  4. java vector pair_C++ vector中使用pair 及 pair的基本用法总结(转)
  5. Android 设置apk之间不覆盖安装,7.0版本问题
  6. 域控的系统时间无法与北京时间同步…
  7. 微信小程序的提示框 showToast 去掉勾,设置icon为null没有效果
  8. mtu 服务器优化,修改MTU值优化网络
  9. J A Game about Increasing Sequences(博弈
  10. 1997-2021年全国30省技术市场成交额(亿元)