zoukankan      html  css  js  c++  java
  • 用户模式同步之信号量小解

    3.信号灯(重点是记住什么样是激发什么样称为未激发)
    信号灯有两种状态,激发和未激发状态,信号灯内部有个计数器,可以理解信号灯内部有N个灯泡,如果有一个灯泡亮着,表示信号灯处于激发状态,如果全部熄灭,信号灯就是处于未激发状态
    同样的信号灯的使用也需要初始化它利用的是CreateSemaphore(SECURITY,LONG(初始化计数个数),LONG(计数器最大个数)。LPCTSTR(NAME))
    第二个参数表示在初始化的时候计数器的值为多少,第三个参数为信号灯的计数器最大值是多少,如果初始值为0则是未激发的状态,非0则是激发状态
    ReleaseSemaphore(HANDLE,LONG(本次操作增加的计数),LONG(以前的计数,传值即可))
    如果对信号灯执行一次等待操作,就会减少一个计数,相当于熄灭一个灯,计数为0,也就是所有灯泡全部熄灭,当前线程进入睡眠状态,直到信号灯变为激发状态。

    #include "stdafx.h"
    #include <windows.h>
    void Sub_1();

    HANDLE __SemaphoreHandle = NULL;
    int main()
    {

    HANDLE SemaphoreHandle = NULL;
    HANDLE ThreadHandle = NULL;
    SemaphoreHandle = CreateSemaphore(NULL, 2, 2, NULL); //创建两个亮着的灯泡
    WaitForSingleObject(SemaphoreHandle, INFINITE); //变为未激发状态
    WaitForSingleObject(SemaphoreHandle, INFINITE);


    __SemaphoreHandle =CreateSemaphore(NULL, 2, 2, NULL); //创建两个亮着的灯泡

    Sub_1();
    WaitForSingleObject(__SemaphoreHandle, INFINITE);
    WaitForSingleObject(__SemaphoreHandle, INFINITE);
    printf("Input AnyKey To Exit ");
    getchar();


    return 0;
    }


    void Sub_1()
    {
    WaitForSingleObject(__SemaphoreHandle, INFINITE);
    ReleaseSemaphore(__SemaphoreHandle, 1, NULL); //点亮一盏灯

    printf("Sub_1() ");
    Sub_1();
    }

  • 相关阅读:
    【CJOJ1167】【洛谷1894】[USACO4.2]完美的牛栏
    【洛谷2055】【CJOJ2487】【ZJOI2009】 假期的宿舍
    【NOIP2012】【CJOJ1093】【洛谷1083】借教室
    如何正确的深蹲
    6种食物
    9大食物 你都吃过几种?
    食物
    如何正确蹲马步 蹲马步的正确方法
    这才是俯卧撑的正确做法!你真的会做俯卧撑吗?
    如何保持良好的状态
  • 原文地址:https://www.cnblogs.com/L-Sunny/p/8443420.html
Copyright © 2011-2022 走看看