C++多线程同步技巧(四)--- 信号量
简介
信号量是维护0到指定最大值之间的同步对象。信号量状态在其计数大于0时是有信号的,而其计数是0时是无信号的。信号量对象在控制上可以支持有限数量共享资源的访问,可以用于线程同步,预防死锁等领域。
信号量的特点和用途可用下列几句话定义:
(1)如果当前资源的数量大于0,则信号量有效;
(2)如果当前资源数量是0,则信号量无效;
(3)系统决不允许当前资源的数量为负值;
(4)当前资源数量决不能大于最大资源数量。
代码样例
////////////////////////////////
//
// FileName : SemaphoreDemo.cpp
// Creator : PeterZheng
// Date : 2018/10/24 11:10
// Comment : The usage of "CreateSemaphore"
//
////////////////////////////////
#pragma once
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <windows.h>
using namespace std;
DWORD WINAPI Func1(LPVOID lpParam);
DWORD WINAPI Func2(LPVOID lpParam);
HANDLE hSemaphore = NULL;
int g_num = 0;
DWORD WINAPI Func1(LPVOID lpParam)
{
while (g_num < 100)
{
LONG count = 0;
WaitForSingleObject(hSemaphore, INFINITE);
cout << "Count: " << g_num << endl;
g_num++;
Sleep(10);
ReleaseSemaphore(hSemaphore, 1, &count); // 释放信号量
}
return 0;
}
DWORD WINAPI Func2(LPVOID lpParam)
{
while (g_num < 100)
{
LONG count = 0;
WaitForSingleObject(hSemaphore, INFINITE);
cout << "Count: " << g_num << endl;
g_num++;
Sleep(10);
ReleaseSemaphore(hSemaphore, 1, &count);
}
return 0;
}
int main(void)
{
hSemaphore = CreateSemaphore(NULL, 1, 100, "Sep"); // 创建信号量
HANDLE hThread[2] = { 0 };
hThread[0] = CreateThread(NULL, 0, Func1, NULL, 0, NULL); // 创建线程1
hThread[1] = CreateThread(NULL, 0, Func2, NULL, 0, NULL); // 创建线程2
WaitForMultipleObjects(2, hThread, TRUE, INFINITE); // 等待线程执行结束
system("pause");
return 0;
}
参考文档
【1】https://blog.csdn.net/s_lisheng/article/details/74278765
C++多线程同步技巧(四)--- 信号量的更多相关文章
- 【Linux】多线程同步的四种方式
背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题? 通过多线程模拟多窗口售票为例: #include <iostream> #include<pthread.h> ...
- linux多线程同步的四种方式
1. 在并发情况下,指令执行的先后顺序由内核决定.同一个线程内部,指令按照先后顺序执行,但不同线程之间的指令很难说清楚是哪一个先执行.如果运行的结果依赖于多线程执行的顺序,那么就会形成竞争条件,每次运 ...
- Windows多线程同步系列之四-----信号量
信号量说实话自己没怎么使用过.书上大概这样说,信号量设置一个资源访问计数.当该计数值大于0的时候,该信号量对象 为有信号状态,当该计数值等于0的时候,该信号量对象为无信号状态. 我们来查几个主要的AP ...
- C++多线程同步之Semaphore(信号量)
一.线程间同步的几种方式 从上篇博文中可以发现,当多个线程对同一资源进行使用时,会产生“争夺”的情况,为了避免这种情况的产生,也就出现了线程间的同步这个技术.线程间的同步有多种方式,在接下来的博文中我 ...
- C++多线程同步技巧(三)--- 互斥体
简介 Windows互斥对象机制. 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问,在线程同步与保证程序单体运行上都有相当大的用处. 代码 ...
- C++多线程同步技巧(二)--- 事件
简介 Windows在线程控制方面提供了多种信号处理机制,其中一种便是使用 CreateEvent() 函数创建事件,然后使用信号控制线程运行.其中将事件变为有信号可使用 SetEvent() 函数, ...
- C++多线程同步技巧(一) --- 临界区
简介 C++中关于多线程的内容对于构建工程来说是至关重要的,C++本身也对关于多线程的操作提供了很好的支持.本章笔者就来介绍一下C++有关于多线程的重要知识点---临界区. 临界区的作用 线程就像是进 ...
- 四十三、Linux 线程——线程同步之线程信号量
43.1 信号量 43.1.1 信号量介绍 信号量从本质上是一个非负整数计数器,是共享资源的数目,通常被用来控制对共享资源的访问 信号量可以实现线程的同步和互斥 通过 sem_post() 和 sem ...
- 多线程(四)多线程同步_Critical Section临界区
临界区是指一个小代码段,在代码能够执行前,它必须独占对某些共享资源的访问权.和使用mutex一样,它们都是以原子操作方式来对共享资源进行访问. 临界区又叫关键代码段,与上一篇的mutex互斥体实现的功 ...
随机推荐
- Mysql加锁过程详解(6)-数据库隔离级别(2)-通过例子理解事务的4种隔离级别
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- Python中的数据结构
Python中的数据结构 这里总结一下Python中的内置数据结构(Built-in Data Structure):列表list.元组tuple.字典dict.集合set,涵盖的仅有部分重点,详细地 ...
- python包导入细节
包导入格式 导入模块时除了使用模块名进行导入,还可以使用目录名进行导入.例如,在sys.path路径下,有一个dir1/dir2/mod.py模块,那么在任意位置处都可以使用下面这种方式导入这个模块. ...
- Go基础系列:简单数据类型
每一个变量都有数据类型,Go中的数据类型有: 简单数据类型:int.float.complex.bool和string 数据结构或组合(composite):struct.array.slice.ma ...
- 翻译:如何向MariaDB中快速插入数据(已提交到MariaDB官方手册)
本文为mariadb官方手册:How to Quickly Insert Data Into MariaDB的译文. 原文:https://mariadb.com/kb/en/how-to-quick ...
- C#正则表达式。
什么是正则表达式: 正则表达式是用来进行文本处理的技术,是语言无关的. 是由普通字符和特殊字符组成的文字模式,用来描述字符串的特征. 元字符: 1. . : 除 \n 以外的任意的单个字符. ...
- surging+CentOS7+docker+rancher2.0 入门部署教程
准备工作 开发环境 Visual Studio 2017 15.5 运行环境 虚拟机CentOS 7+Docker+Rancher 2.0+Consul+RabbmitMQ 项目下载地址 htt ...
- python学习笔记(一)、列表和元祖
该一系列python学习笔记都是根据<Python基础教程(第3版)>内容所记录整理的 1.通用的序列操作 有几种操作适用于所有序列,包括索引.切片.相加.相乘和成员资格检查.另外,Pyt ...
- 【Java每日一题】20170119
20170118问题解析请点击今日问题下方的“[Java每日一题]20170119”查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; import jav ...
- angular $index获取ng-repeat的上一条数据
<div ng-repeat="item in dataList" ng-click="func($index,$index-1)"></di ...