一:介绍

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

信号量遵循规则:
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表示不需要传出
    )

三:代码实现

 /********************************************************
Copyright (C), 2016-2018,
FileName: t13
Author: woniu201
Email: wangpengfei.201@163.com
Created: 2018/10/24
Description: 线程同步-信号量
********************************************************/
#include <iostream>
#include <Windows.h> using namespace std; volatile int number = ;
HANDLE hSemaphore; DWORD CALLBACK ThreadFun1(LPVOID pParam)
{
while ()
{
WaitForSingleObject(hSemaphore, INFINITE); //等待信号量
cout << "Thread1:" << number++ << endl;
ReleaseSemaphore(hSemaphore, , NULL); //信号量的当前资源+1
if (number >= )
{
break;
} }
return ;
} DWORD CALLBACK ThreadFun2(LPVOID pParam)
{
while ()
{
WaitForSingleObject(hSemaphore, INFINITE); //等待信号量
cout << "Thread2:" << number++ << endl;
ReleaseSemaphore(hSemaphore, , NULL); //信号量的当前资源+1
if (number >= )
{
break;
}
}
return ;
} int main()
{
//创建自动事件
hSemaphore = CreateSemaphore(NULL, , , NULL); CreateThread(NULL, , ThreadFun1, NULL, , NULL);
CreateThread(NULL, , ThreadFun2, NULL, , NULL); getchar();
return ;
}

扫码关注公众号

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

最新文章

  1. 窥探Swift之使用Web浏览器编译Swift代码以及Swift中的泛型
  2. CDN技术发展趋势
  3. DLL数据共享在不同处定义效果不同..
  4. python变量不能以数字打头
  5. UTR#2 T1
  6. 【转】 自定义iOS7导航栏背景,标题和返回按钮文字颜色
  7. HTML5实战与剖析之classList属性
  8. incallui中如何查询联系人数据
  9. 豹哥嵌入式讲堂:ARM开发之文件详解(2)- linker文件
  10. Linux 最小系统制作
  11. Nginx 作用
  12. 4、下行短信发送WebService、下行短信发送服务 -功能详细设计 --短信平台
  13. Python批量执行oracle中的insert语句
  14. JavaScript事件模型
  15. Cobalt Strike深入使用
  16. jquery获取table,遍历输出tr中各个td的内容(转载)
  17. 2018年浙江中医药大学程序设计竞赛 Solution
  18. ScrollView的基本用法丶代理方法
  19. [SQL] 简单新建(create)删除(drop\delete)权限(grant/revoke)修改(set\update)
  20. BZOJ 1001 狼抓兔子 平面图的最小割

热门文章

  1. MariaDB 数据库迁移
  2. 变量声明和定义的关系------c++ primer
  3. day2学python 数据类型+深浅拷贝+循环
  4. ubuntu安装nginx与配置
  5. Unite Shanghai 2019全日程曝光(建议收藏)
  6. 【arc074e】RGB Sequence dp
  7. HDU6330-2018ACM暑假多校联合训练Problem L. Visual Cube
  8. 基于Solr的多表join查询加速方法
  9. 解决 Github用户名 变为 invalid-email-address 问题
  10. [jvm]基于jvm的线程实现