多线程之信号量(By C++)
信号量在多线程中,主要是用于线程的同步或者限制线程运行的数量。
所谓同步,当流程1运行在线程1中,流程2运行在线程2中,流程2必须在流程1结束之后才能开始执行。你会怎么做,所有就需要给出一个流程1结束的信号。
在信号来之前,让线程2先在某个位置等待,这个使用方式和互斥锁有点类似,互斥从某种意义上也是一种同步,只是互斥锁更倾向于保护共同资源。信号量大于0的时候就代表有信号,不需要等待,但不仅仅是1。
下面的这个例子设置了3个线程,设置最大同时只运行2个进程。
#include<Windows.h>
#include<iostream>
using namespace std;
//创建一个信号量
HANDLE hSemaphore; //有参数
DWORD WINAPI MyThread2(LPVOID lpParamter)
{
while ()
{
WaitForSingleObject(hSemaphore,INFINITE);
cout << "MyThread1 Runing :"<<"线程2" << endl;
Sleep();
ReleaseSemaphore(hSemaphore,,NULL);//释放信号量 }
}
//无参数
DWORD WINAPI MyThread1(LPVOID lpParamter)
{
while ()
{
//信号量减1,如果等于0就进入睡眠,待大于0之后再减
WaitForSingleObject(hSemaphore,INFINITE);
cout << "MyThread2 Runing"<<"线程1" << endl;
Sleep();
//信号量加1
ReleaseSemaphore(hSemaphore,,NULL);//释放信号量
}
}
//无参数
DWORD WINAPI MyThread3(LPVOID lpParamter)
{
while ()
{
//信号量减1,如果等于0就进入睡眠,待大于0之后再减
WaitForSingleObject(hSemaphore,INFINITE);
cout << "MyThread2 Runing"<<"线程3" << endl;
Sleep();
//释放信号量,信号量加1
ReleaseSemaphore(hSemaphore,,NULL);
}
} int main()
{ //创建一个信号量,2是初值,3是最大值
hSemaphore =CreateSemaphore(NULL,,,NULL); //第三个参数是线程函数的地址,第四个参数是传到线程的参数指针
HANDLE hThread = CreateThread(NULL, , MyThread1, NULL, , NULL);
//释放句柄
CloseHandle(hThread); HANDLE hThread1 = CreateThread(NULL, , MyThread2, NULL, , NULL);
CloseHandle(hThread); HANDLE hThread3 = CreateThread(NULL, , MyThread3, NULL, , NULL);
//释放句柄
CloseHandle(hThread3);
while();
return ;
}
结果可以看到,三个线程交替运行2个
aaarticlea/png;base64,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" alt="" />
多线程之信号量(By C++)的更多相关文章
- Linux多线程编程-信号量
在Linux中.信号量API有两组.一组是多进程编程中的System V IPC信号量.另外一组是我们要讨论的POSIX信号量. 这两组接口类似,但不保证互换.POSIX信号量函数都已sem_开头,并 ...
- 第十五章、Python多线程之信号量和GIL
目录 第十五章.Python多线程之信号量和GIL 1. 信号量(Semaphore) 2. GIL 说明: 第十五章.Python多线程之信号量和GIL 1. 信号量(Semaphore) 信号量用 ...
- [并发编程 - 多线程:信号量、死锁与递归锁、时间Event、定时器Timer、线程队列、GIL锁]
[并发编程 - 多线程:信号量.死锁与递归锁.时间Event.定时器Timer.线程队列.GIL锁] 信号量 信号量Semaphore:管理一个内置的计数器 每当调用acquire()时内置计数器-1 ...
- java多线程-Semaphore信号量使用
介绍 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确.合理的使用公共资源. 概念 Semaphore分为单值和多值两种,前者 ...
- windows多线程同步--信号量
推荐参考博客:秒杀多线程第八篇 经典线程同步 信号量Semaphore 首先先介绍和windows信号量有关的两个API:创建信号量.释放信号量 HANDLE WINAPI CreateSem ...
- Java多线程系列——信号量:Semaphore
简介 信号量为多线程协作提供了更为强大的控制方法.也可以说,信号量是对锁的扩展.无论是内部锁 synchronized 还是重入锁 ReentrantLock,一次都只允许一个线程访问一个资源,而信号 ...
- Linux多线程--使用信号量同步线程【转】
本文转载自:http://blog.csdn.net/ljianhui/article/details/10813469 信号量.同步这些名词在进程间通信时就已经说过,在这里它们的意思是相同的,只不过 ...
- [.net 多线程]Semaphore信号量
信号量(Semaphore)是一种CLR中的内核同步对象.与标准的排他锁对象(Monitor,Mutex,SpinLock)不同的是,它不是一个排他的锁对象,它与SemaphoreSlim,Reade ...
- Linux下多线程编程-信号量
今天来谈谈线程的同步--信号量. 首先来看看一些概念性的东西: 如进程.线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行:B依言执行,再将结果给 ...
随机推荐
- Velocity 局部定制模板
Velocity介绍 Velocity是一个基于java的template engine.它允许Web designer引用Java Code中定义的方法.Web designer可以和Java工程师 ...
- shell test用法
1)判断表达式 if test (表达式为真) if test !表达式为假 test 表达式1 –a 表达式2 两个表达式都为真 test 表达式1 –o 表达式 ...
- Linux系统启动过程
1. 从BIOS到KERNEL BIOS自检->MBR(GRUB)->KERNEL->KERNEL自解压->内核初始化->内核启动 BIOS自检 当电脑开机的时候,电脑会 ...
- 07-本地 YUM 源制作
1.YUM相关概念 1.1.什么是YUM YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基 ...
- UnixBench-linux下的跑分软件
UnixBench是一款开源的测试 unix 系统基本性能的工具,是比较通用的测试VPS性能的工具.UnixBench会执行一系列的测试,包括2D和3D图形系统的性能,测试的结果不仅仅是CPU,内存, ...
- PX 和PT的区别
字体大小的设置单位,常用的有2种:px.pt.这两个有什么区别呢? 先搞清基本概念:px就是表示pixel,像素,是屏幕上显示数据的最基本的点: pt就是point,是印刷行业常用单位,等于1/72英 ...
- client offset screen 的区别
clientX 设置或获取鼠标指针位置相对于窗口客户区域的 x 坐标,其中客户区域不包括窗口自身的控件和滚动条. clientY 设置或获取鼠标指针位置相对于窗口客户区域的 y 坐标,其中客户区域不包 ...
- 浅谈HTTP中Get与Post的区别
引用自:http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET ...
- java类加载器及其委托机制
1.什么是类加载器,类加载器父子结构.BootStrap-->ExtClassLoader-->AppClassLoader,级别依次降低 2.类加载器之间的父子关系和管辖范围 3.类加载 ...
- git常用的命令集合
Git 是一个很强大的分布式版本控制系统.它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势. Git常用操作命令: 1) 远程仓库相关命令 检出仓库:$ git clone g ...