Windows环境下多线程编程原理与应用读书笔记(8)————信号量及其应用
<一>线程间同步原因
- 线程间竞争共享资源;
- 线程间为完成某个任务而协作;
通过互斥量可以实现线程间由于竞争所需要的同步,通过事件可以实现线程间由于协作所需要的同步。
信号量很好地将互斥量和事件结合起来,同时解决竞争和协作问题。
信号量的两个核心操作:提高计数值和降低计数值(Up 和 Down)。Down操作时检查信号量的计数值是否大于0,如果大于0,则信号量的计数值减1,线程继续运行;如果计数值为0,线程由于不能获得信号量而进入睡眠状态。这两个操作都是不可再分的操作。
与信号量有关的函数:
| 函数名 | 作用 |
| CreateSemaphore | 创建一个信号量 |
| OpenSemaphore | 打开一个已经创建的信号量 |
| ReleaseSemaphore | 释放对信号量的所有权 |
老规矩,看例子:
#include <windows.h>
#include <process.h> /* _beginthread, _endthread */
#include <iostream>
#include <fstream>
using namespace std; HANDLE hSemaphore; DWORD WINAPI myThread(LPVOID lpParam)
{
int* pNo = (int*)lpParam;
WaitForSingleObject(hSemaphore,INFINITE);//等待信号量 cout<<"*****Thread #"<<*pNo<<" Get the semaphore"<<endl;
Sleep(*(*pNo)); cout<<"*****Thread #"<<*pNo<<" release the semaphore"<<endl;
ReleaseSemaphore(hSemaphore,,NULL);//指定要信号量的计数值增加1
return ;
} int main()
{
DWORD dw;
hSemaphore = CreateSemaphore(NULL,,,NULL);//初始值为3,最大值也为3的信号量
int t[];
for (int i=;i<;i++)
{
t[i]=i+;
CreateThread(NULL,,myThread,t+i,,&dw);
}
Sleep();
return ;
}
Windows环境下多线程编程原理与应用读书笔记(8)————信号量及其应用的更多相关文章
- Windows环境下多线程编程原理与应用读书笔记(1)————基本概念
自从学了操作系统知识后,我就对多线程比较感兴趣,总想让自己写一些有关多线程的程序代码,但一直以来,发现自己都没怎么好好的去全面学习这方面的知识,仅仅是完成了操作系统课程上的小程序,对多线程的理解也不是 ...
- Windows环境下多线程编程原理与应用读书笔记(3)————Windows环境中的多线程实现(3)
纤程 纤程(fiber): 相当于用户级别的线程或轻进程.纤程由Win32库函数支持,对核心是不可见的.纤程可以通过SwitchToFiber显示至另一合作纤程,以实现合作纤程之间的协同.线程是在Wi ...
- Windows环境下多线程编程原理与应用读书笔记(7)————事件及其应用
<一>事件 事件主要用于线程间传递消息,通过事件来控制一个线程是处于执行状态还是处于挂起状态. 事件和互斥量之间的差别: 事件主要用于协调两个或者多个线程之间的动作,使其协调一致,符合逻辑 ...
- Windows环境下多线程编程原理与应用读书笔记(6)————临界段及其应用
<一>临界段 临界段对象通过提供所有线程必须共享的对象来控制线程.只有拥有临界段对象的线程才能够访问保护的资源.在另一个线程可以访问该资源之前,前一线程必须释放临界段对象,一遍新的线程可以 ...
- Windows环境下多线程编程原理与应用读书笔记(5)————互斥及其应用
<一>互斥的同步机制 思想:当一个线程获得互斥量了后,其他所有要获取同一个互斥量的线程都处于阻塞状态,直到第一个线程释放互斥量为止. 设想几个线程竞争同一个互斥量,其中一个线程获得了互斥量 ...
- Windows环境下多线程编程原理与应用读书笔记(2)————面向对象技术
面向对象技术是学C++需要重点掌握的知识,因为我觉得自己的基础还是比较可以,这一章节的内容就只是粗略的读了一遍,在此就不做过多的笔记.
- Windows环境下多线程编程原理与应用读书笔记(4)————线程间通信概述
<一>线程间通信方法 全局变量方式:进程中的线程共享全局变量,可以通过全局变量进行线程间通信. 参数传递法:主线程创建子线程并让子线程为其服务,因此主线程和其他线程可以通过参数传递进行通信 ...
- Java多线程编程实战指南 设计模式 读书笔记
线程设计模式在按其有助于解决的多线程编程相关的问题可粗略分类如下. 不使用锁的情况下保证线程安全: Immutable Object(不可变对象)模式.Thread Specific Storage( ...
- 关于docker在windows环境下运行的第一次体验
关于docker在windows环境下执行的原理 1.1. 首先是Docker Quickstart启动,如果在虚拟机Oracle VM VirtualBox不存在default虚 ...
随机推荐
- Excel开发之旅(二)----数据的读写
1.要实现数据的读写,首先,我们需要添加引用: using Excel=Microsoft.Office.Interop.Excel; 直接在项目中添加即可. 2.给3个按钮添加响应事件,工程代码截图 ...
- 用wrk测试nginx/ndoejs/golang
sudo taskset -c ./wrk -c1 -t1 -d30 http://localhost/hello wrk+nginx(helloworld module) sudo taskset ...
- php数组合并,反转,去重,添加元素等;
//参数默认值//function abc($a,$b,$c = 0){// echo $a,$b,$c;//}//abc(1,3);//结果等于130://echo "<br> ...
- Redis学习——Redis事务
Redis和传统的关系型数据库一样,因为具有持久化的功能,所以也有事务的功能! 有关事务相关的概念和介绍,这里就不做介绍. 在学习Redis的事务之前,首先抛出一个面试的问题. 面试官:请问Redis ...
- Vue路由vue-router
前面的话 在Web开发中,路由是指根据URL分配到对应的处理程序.对于大多数单页面应用,都推荐使用官方支持的vue-router.Vue-router通过管理URL,实现URL和组件的对应,以及通过U ...
- OWLQN算法
一.BFGS算法 算法思想如下: Step1 取初始点,初始正定矩阵,允许误差,令: Step2 计算: Step3 计算,使得 : Step4 令: Step5 如果,则取为 ...
- Python自学笔记-递归函数(来自廖雪峰的官网Python3)
感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. 递归函数 ...
- 初识Hibernate之关联映射(二)
上篇我们介绍了关联映射的几种形式,有单向多对一,单向一对多,还有双向一对多.本篇接着介绍有关关联映射的其他几种映射方式,主要有以下几种: 基于外键的单向一对一关联映射 基于主键的单向一对一关联映射 单 ...
- python的urlparse
urlparse主要是URL的分解和拼接,分析出URL中的各项参数,可以被其他的URL使用. 主要的函数有: 1.urlparse 将URL分解为6个片段,返回一个元组,包括协议.基地址.相对地址等等 ...
- Linq常用List操作总结,ForEach、分页、交并集、去重、SelectMany等
/* 以下围绕Person类实现,Person类只有Name和Age两个属性 一.List<T>排序 1.1 List<T>提供了很多排序方法,sort(),Orderby() ...