Windows系统为我们提供了相关API,我们可以使用他们来进行多线程编程。

1.创建一个线程,参数解释如下:

HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD:线程安全相关的属性,常置为NULLSIZE_T dwStackSize,//initialstacksize:新线程的初始化栈的大小,可设置为0LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction:被线程执行的回调函数,也称为线程函数LPVOID lpParameter,//threadargument:传入线程函数的参数,不需传递参数时为NULLDWORD dwCreationFlags,//creationoption:控制线程创建的标志LPDWORD lpThreadId//threadidentifier:传出参数,用于获得线程ID,如果为NULL则不返回线程ID
)

2.创建一个信号量,参数解释如下:

HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // 安全属性指针LONG lInitialCount, // 初始计数LONG lMaximumCount, // 最大计数LPCTSTR lpName // 对象名指针
);

3.P操作,参数解释如下:

DWORD WaitForSingleObject(
HANDLE hObject, //指明一个内核对象的句柄
DWORD dwMilliseconds); //等待时间

4.V操作,参数解释如下:

ReleaseSemaphore(HANDLE hSemaphore,LONG lReleaseCount,LPLONG lpPreviousCount);hSemaphore 是要增加的信号量句柄。
lReleaseCount 是增加的计数。
lpPreviousCount 是增加前的数值返回。

5:基础示例:

#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;Sleep(200);//每次休眠200ms}return 0;
}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;Sleep(500);//每次休眠500ms}system("pause");return 0;
}

6:进阶示例:

问题描述:桌上有一空盘,最多允许存放一个水果。爸爸可向盘中放一个苹果或放一个桔子,儿子专等吃盘中的桔子,女儿专等吃苹果。 编写Windows下父亲儿子女儿放取水果进程同步的演示程序。

#include<iostream>
#include <stdio.h>
#include<string.h>
#include<windows.h>
using namespace std;HANDLE g_apple = 0;//女儿线程互斥:表示可否取苹果
HANDLE g_orange = 0;//儿子线程互斥:表示可否取桔子
HANDLE g_hMutex = 0; //父亲线程互斥:表示可否向盘中放水果bool g_continue = true; //控制程序运行和结束
DWORD WINAPI Father(LPVOID); //父亲线程
DWORD WINAPI Son(LPVOID);//儿子线程
DWORD WINAPI Daughter(LPVOID);//女儿线程int main()
{//创建各个信号量g_orange = CreateSemaphore(NULL, 0, 1, NULL);g_apple = CreateSemaphore(NULL, 0, 1, NULL);g_hMutex = CreateSemaphore(NULL, 1, 1, NULL);DWORD threadID[3];HANDLE hThreads[3];//创建父亲线程hThreads[0] = CreateThread(NULL, 0, Father, NULL, 0, &threadID[0]);if (hThreads == NULL) return -1;//创建儿子线程hThreads[1] = CreateThread(NULL, 0, Son, NULL, 0, &threadID[1]);if (hThreads == NULL) return -1;//创建女儿线程hThreads[2] = CreateThread(NULL, 0, Daughter, NULL, 0, &threadID[2]);if (hThreads == NULL) return -1;while (g_continue){if (getchar()){  //按回车后终止程序运行g_continue = false;}}return 0;
}//父亲线程
DWORD WINAPI Father(LPVOID lpPara)
{while (g_continue){WaitForSingleObject(g_hMutex, INFINITE);//INFINITE表示无限等待,一直等到当g_hMutex为1时才进行下面操作int m = rand() % 2;//rand取随机数,随机放苹果或者桔子if (m == 1) {cout<< "父亲放入一个苹果!" <<endl;Sleep(1500);ReleaseSemaphore(g_apple, 1, NULL);}else{cout<< "父亲放入一个桔子!" <<endl;Sleep(1500);ReleaseSemaphore(g_orange, 1, NULL);}}return 0;
}//女儿线程
DWORD WINAPI Daughter(LPVOID lpPara)
{while (g_continue){WaitForSingleObject(g_apple, INFINITE);cout<< "女儿吃到一个苹果!" <<endl;Sleep(1500);ReleaseSemaphore(g_hMutex, 1, NULL);}return 0;
}//儿子线程
DWORD WINAPI Son(LPVOID lpPara)
{while (g_continue){WaitForSingleObject(g_orange, INFINITE);cout<< "儿子吃到一个桔子!" <<endl;Sleep(1500);ReleaseSemaphore(g_hMutex, 1, NULL);}return 0;
}

笔记:windows环境下线程编程(C++实现同步与互斥)相关推荐

  1. Windows环境下Unicode编程总结和将ANSI转换到Unicode 将Unicode转换到ANSI

    Windows环境下Unicode编程总结 UNICODE环境设置 在安装Visual Studio时,在选择VC++时需要加入unicode选项,保证相关的库文件可以拷贝到system32下. UN ...

  2. windows环境下unicode编程总结

    windows环境下unicode编程总结 UNICODE环境设置 在安装Visual Studio时,在选择VC++时需要加入unicode选项,保证相关的库文件可以拷贝到system32下. UN ...

  3. Android笔记——Windows环境下Android Studio v1.0安装教程

    本文主要讲解Windows环境下Android Studio的安装教程,Mac的Android Studio安装与此类似不在赘述,另外友情提示Windows下的SDK与Mac的SDK是通用的,可以直接 ...

  4. 一文搞定Linux环境下线程编程,这些东西老师也不会教你。(史上最详细的线程攻略)

    一.线程的概念 1.1 什么是线程 线程是一个实体,是CPU调度和分派的基本单元,有时我们也可以称它为轻量级的进程.每个线程都包含有表示执行环境所必须的信息,其中包括标识线程 的线程ID.一组寄存器值 ...

  5. Windows环境下多线程编程原理与应用读书笔记(8)————信号量及其应用

    <一>线程间同步原因 线程间竞争共享资源: 线程间为完成某个任务而协作: 通过互斥量可以实现线程间由于竞争所需要的同步,通过事件可以实现线程间由于协作所需要的同步. 信号量很好地将互斥量和 ...

  6. (一)Windows环境下汇编编程读书笔记

    看了一节关于80x86系列处理器简史,不知道云里和雾里,什么晶体管啊,什么什么之类的不知道云里和雾里,看了讲什么都不知道啊! 转载于:https://www.cnblogs.com/Nuxgod/ar ...

  7. java 内存映射文件进程间通讯_[转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile...

    进程间的通信方式有很多种, 上次我们说了最傻瓜的"共享外存/文件"的方法. 那么, 在本文中, 我们即将学习"共享内存"的方式实现进程间的通信, 这是IPC最快 ...

  8. Windows环境下实现设计模式——模板方法模式(JAVA版)

    我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows环境下如何编程实现模板方法模式(设计模式). 不知道大家有没有这样的感觉,看了一大堆编程和设计模式的书,却还是很难理解设计模式 ...

  9. Windows环境下实现设计模式——访问者模式(JAVA版)

    我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows环境下如何编程实现访问者模式(设计模式). 不知道大家有没有这样的感觉,看了一大堆编程和设计模式的书,却还是很难理解设计模式, ...

最新文章

  1. Nature:揭示人大脑类器官为何缺乏正常人脑特有的细胞亚型和复杂回路
  2. 异常 Cannot resolve class or package
  3. 陶哲轩实分析 定理 8.2.2 (无限和的富比尼定理) 证明
  4. XCTF easyCpp buu [MRCTF2020]EasyCpp
  5. step3 . day8数据结构之算法
  6. 如何去掉有背景图的a标签的边框
  7. iap 审核 文档_为什么必须审核文档
  8. 推荐系统评测指标—精准率(Precision)、召回率(Recall)、F值(F-Measure)
  9. 命令 所有的虚拟环境_Python虚拟环境安装与配置
  10. 小程序云开发表单提交并在页面中获取数据
  11. [雷霄骅]修改了一个YUV/RGB播放器
  12. 微信会员系统的具体操作流程,怎么使用微信会员卡管理系统制作 button onclick=myFunction()
  13. TIPTOP报表提示:foreach: 字元轉換至數字程序失敗.
  14. JsonEquals - JSON 差异比较工具的使用
  15. SEO优化之浅谈蜘蛛日志
  16. java定义一个方法计算三角形,长方形,圆形面积和周长
  17. 测试开发 - 十年磨一剑(五)UI自动化测试框架与分层结构
  18. 岁月悠悠,衰微只及肌肤;热忱抛却,颓废必致灵魂
  19. 日本自动外币兑换机公司ActPro在两年半时间内占据全球市场份额第一名
  20. java计算机毕业设计智能小区物业管理系统源码+系统+lw+数据库+调试运行

热门文章

  1. 利尔达展芯再度蝉联全球电子元器件分销商卓越表现奖
  2. 关于建站和域名的杂谈
  3. 中国中药配方颗粒行业竞争状况分析与投资前景展望研究报告2022-2027年版
  4. Mysql复制表结构、表数据
  5. php生成一组随机数_php如何生成随机数?(代码示例)
  6. #10166. 「一本通 5.3 练习 1」数字游戏
  7. 陕西铨讯电子厂工程师_2020年陕西省工业和信息化厅关于工程师职称评审的公告...
  8. 深入了解const !!!
  9. Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)
  10. 场效应三极管及其放大电路学习笔记