用户模式同步之信号量小解

Posted _Flame

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用户模式同步之信号量小解相关的知识,希望对你有一定的参考价值。

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\r\n");
getchar();


return 0;
}


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

printf("Sub_1()\r\n");
Sub_1();
}

以上是关于用户模式同步之信号量小解的主要内容,如果未能解决你的问题,请参考以下文章

用户模式同步之事件小解

Linux内核同步机制之completion

[内核同步]Linux内核同步机制之completion

JUC系列01之大话并发

Redis原理篇之网络模型

线程与进程