• 线程同步(windows平台):信号量


    一:介绍

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

    信号量遵循规则:
    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编程等相关技术,在这里一起探讨,一起学习,一起进步,不定期分享视频书籍资源,充分利用碎片化时间,让我们的技术之路更加有乐趣。

  • 相关阅读:
    Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类
    入门设计模式之桥梁模式
    入门设计模式之外观模式
    入门设计模式之策略
    入门设计模式之观察者
    入门设计模式之模板
    入门设计模式之原型
    入门设计模式之工厂
    几分钟几张图教你学会如何使用UML
    入门设计模式之建造者
  • 原文地址:https://www.cnblogs.com/woniu201/p/9855402.html
Copyright © 2020-2023  润新知