一:介绍

信号量也是系统核心对象,它允许多个线程同一时刻访问同一资源,但需限制同一时刻访问资源的最大线程数目。

信号量遵循规则:
1.当前资源计数大于0,信号量有效。
2.当前资源计数等于0,信号量无效。
3.系统不允许当前资源数量为负。
4.当前资源数量不能大于最大资源数量。

二:函数说明

创建信号量:
    HANDLE   CreateSemaphore( 
        LPSECURITY ATTRIBUTES   lpSemaphoreAttributes,     //安全属性 
        LONG   lInitialCount,                                     //信号量对象的初始值该值必须大于等于0,小于等于lMaximumCount。大于0时,信号量被唤醒。 当释放了一个等待该信号量的线程时,lInitialCount值减1,当调用函数ReleaseSemaphore()时,按其指定的数量加一个值。
        LONG   lMaximumCount,                             //信号量的最大值,必须大于0
        LPCTSTR   lpName                                       //信号量名 
    )
    
获得信号量对象:
    DWORD WaitForSingleObject( 
            HANDLE hHandle,        //事件对象的句柄 
            DWORD dwMilliseconds    //0:测试对象的状态立即返回;INFINITE:对象被触发信号后,函数才会返回
    )

释放信号量:
    BOOL  ReleaseSemaphore(
        HANDLE  hSemaphore,            //信号量句柄
        LONG      lReleaseCount,         //增加个数,大于0,小于信号量最大值
        LPLONG  lpPreviousCount     //可以用来传出先前的资源计数,设为NULL表示不需要传出
    )

三:代码实现

 1 /********************************************************
 2 Copyright (C),  2016-2018,
 3 FileName:        t13
 4 Author:            woniu201
 5 Email:             wangpengfei.201@163.com
 6 Created:           2018/10/24
 7 Description:    线程同步-信号量
 8 ********************************************************/
 9 #include <iostream>
10 #include <Windows.h>
11
12 using namespace std;
13
14 volatile int number = 1;
15 HANDLE hSemaphore;
16
17 DWORD CALLBACK ThreadFun1(LPVOID pParam)
18 {
19     while (1)
20     {
21         WaitForSingleObject(hSemaphore, INFINITE);    //等待信号量
22         cout << "Thread1:" << number++ << endl;
23         ReleaseSemaphore(hSemaphore, 1, NULL);        //信号量的当前资源+1
24         if (number >= 1000)
25         {
26             break;
27         }
28
29     }
30     return 0;
31 }
32
33 DWORD CALLBACK ThreadFun2(LPVOID pParam)
34 {
35     while (1)
36     {
37         WaitForSingleObject(hSemaphore, INFINITE);   //等待信号量
38         cout << "Thread2:" << number++ << endl;
39         ReleaseSemaphore(hSemaphore, 1, NULL);        //信号量的当前资源+1
40         if (number >= 1000)
41         {
42             break;
43         }
44     }
45     return 0;
46 }
47
48
49 int main()
50 {
51     //创建自动事件
52     hSemaphore = CreateSemaphore(NULL, 1, 1, NULL);
53
54     CreateThread(NULL, 0, ThreadFun1, NULL, 0, NULL);
55     CreateThread(NULL, 0, ThreadFun2, NULL, 0, NULL);
56
57     getchar();
58     return 1;
59 }

扫码关注公众号

专注分享Java,C/C++,STL,Spring框架,mybatis框架,mysql,redis,分布式,高并发,设计模式,爬虫,docker,shell编程等相关技术,在这里一起探讨,一起学习,一起进步,不定期分享视频书籍资源,充分利用碎片化时间,让我们的技术之路更加有乐趣。

转载于:https://www.cnblogs.com/woniu201/p/9855402.html

线程同步(windows平台):信号量相关推荐

  1. C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent

    C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent 本章概要: 1:终止状态和非终止状态 2:AutoResetEvent和ManualResetE ...

  2. 改善C#程序的建议6:在线程同步中使用信号量

    所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定.C#中对象的类型分为引用类型和值类型.CLR在这两种类型上的等待是不一样的.我们可以简单的理解为在CL ...

  3. RT-Thread 线程同步及通信 -- 信号量、互斥量、事件、邮箱、消息队列

    目录 一  RT-Thread 信号量 二  RT-Thread 互斥量 三  RT-Thread 事件标志组 四  RT-Thread 邮箱 五  RT-Thread 消息队列 一  RT-Thre ...

  4. Linux线程同步机制四--信号量sem

    一.信号量基本原理 信号量概念由荷兰科学家Dijkstra首先提出.信号量是一个特殊类型的变量,它可以被增加或者减少.但对其的关键访问被保证是原子操作,即使在一个多线程程序中也是如此. 信号量有两种类 ...

  5. c++ linux 线程等待与唤醒_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...

    为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...

  6. 判断sem信号量为零_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...

    为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...

  7. 【Window】线程同步方式1——临界区(关键代码段)

    第一节:[Window]创建线程的3种方式 第二节:[Window]线程同步概述 第三节:[Window]线程同步方式1--临界区(关键代码段) 第四节:[Window]线程同步方式2--互斥量 第五 ...

  8. 【Window】线程同步概述

    第一节:[Window]创建线程的3种方式 第二节:[Window]线程同步概述 第三节:[Window]线程同步方式1--临界区(关键代码段) 第四节:[Window]线程同步方式2--互斥量 第五 ...

  9. 【Windows】线程漫谈——线程同步之信号量和互斥量

    本系列意在记录Windwos线程的相关知识点,包括线程基础.线程调度.线程同步.TLS.线程池等 信号量内核对象 信号量内核对象用来进行资源计数,它包含一个使用计数.最大资源数.当前资源计数.最大资源 ...

  10. 《Windows via C/C++》学习笔记 —— 内核对象的“线程同步”之“信号量”

    "信号量内核对象"用于对资源进行计数. 在信号量内核对象内部,和其他内核对象一样,有一个使用计数,该使用计数表示信号量内核对象被打开的次数. 信号量内核对象中还有两个比较重要的数据 ...

最新文章

  1. 华为虚拟home键关闭_苹果iPhone12或放弃静音键,学华为mate30Pro,发力虚拟按键
  2. 4.Spring Cloud Alibaba教程:Nacos配置管理
  3. 接口IDisposable的用法
  4. LeetCode 186. 翻转字符串里的单词 II
  5. java web 定制化界面_实现javaWeb网页自定义出错界面
  6. 关于lua字节码在32位和64位系统上不兼容的问题
  7. 【数字信号】基于matlab GUI数字电子琴【含Matlab源码 273期】
  8. matlab转置的问题
  9. Mosquitto安装配置websockets
  10. 高可用、全集成、定制化,蚂蚁金服自动化测试如何演进
  11. Triplet-Graph Reasoning Network for few-shot Metal Generic Surface Defect Segmentation论文理解
  12. 解决Alienware M11R2 AlienFX运行报错
  13. 解决了新版微信个人收款二维码在H5网页里不能长按识别支付
  14. DataStory X Kungfu | DemoDay亮点大揭秘
  15. 女程序员开淘宝店兼职---详细注册成为淘宝商家步骤
  16. 企业财务报表查询方式
  17. 迪丽热巴qq号是多少要真的?迪丽热巴的qq号是多少要真的在线的?
  18. 计算机windows错误恢复,Win7系统出现Windows错误恢复该怎么办?
  19. vscode设置#define定义宏
  20. 亚信联创2012校园招聘笔试题【转自网络】

热门文章

  1. 双目测距(一)--图像获取与单目标定
  2. TypeError: descriptor '__init__' requires a 'super' object but received a 'str'
  3. exif viewer java,1earn/XSS挑战-WalkThrough.md at master · dizhaung/1earn · GitHub
  4. 【汇编语言】开发过程
  5. spark graphx入门
  6. Windows核心编程_窗口透明组件不透明
  7. 《精通 ASP.NET MVC 5》----1.5 本书的结构
  8. 关于opencv设置视频的属性无效问题
  9. SAS学习笔记之《SAS编程与数据挖掘商业案例》(2)数据获取与数据集操作
  10. [Erlang脚印 0004] gen_server