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

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();
}

原文地址:https://www.cnblogs.com/L-Sunny/p/8443420.html

时间: 2024-11-08 18:51:22

用户模式同步之信号量小解的相关文章

用户模式同步之事件小解

事件(和WaitForSingleObject等待函数配套)如果我们要用事件一定记住的是利用CreateEvent(LPSECURITY,BOOL(手动or自动),BOOL(初始状态),LPCTSTR(NAME)) 初始化事件对于第二参数的手动还是自动选择自动就行,因为手动的话遇到WaitForSingleObject的时候还得自己设置变成未激发状态,自动的话当遇到WaitForSingleObject会自动变为未激发状态一般思路:1.初始化事件,2.事件返回的句柄作为参数传入线程3.然后在线程

用户模式同步之互斥体小解

1.互斥体(互斥体类似于同步事件)互斥体可避免多个线程争夺一个资源的问题,多线程环境下,如果一个线程获得互斥体,不释放的话其他的线程就获得不了该资源它与同步事件的区别:是在同一个线程内它可以递归获得互斥体,也就是这个线程获得互斥体后对再次去获得认可不排斥,同步我们显而易见的得知不允许这样他有激发未激发两种状态,记住!!!获得互斥体是未激发状态,释放互斥体是激发状态,他和信号量区别清楚同样使用它首先要初始化;CreateMutex(SECURITY,BOOL(是否被占有),LPCTSTR(name

线程同步——用户模式下线程同步——Interlocked实现线程同步

1 线程同步分为用户模式下的线程同步和内核对象的线程同步. 2 3 当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局 4 5 6 7 8 //1.利用原子访问: Interlocked系列函数,关于Interlocked系列函数,我需要知道的是他们,执行的极快 9 10 //(1)首先是InterlockedExchangeAdd兄弟函数, 11 //第一个参数 Addend 代表进行操作数的地址, 12 //第二个参数 Value 代表增加的值,如果是想进行减法,传负数即可 13

线程同步——用户模式下线程同步——Slim读写锁实现线程同步

1 //Slim读/写锁实现线程同步 2 SRWlock 的目的和关键段相同:对同一资源进行保护,不让其它线程访问. 3 但是,与关键段不同的是,SRWlock允许我们区分哪些想要读取资源的线程(读取者线程) 4 和哪些想要更新资源值的线程(写入者线程).让所有读取者资源在同一时刻访问共享资源应该是 5 可行的,这是因为仅仅读取资源并不存在破坏数据的风险.只有当写入者线程想要对资源进行更新时才需要同步. 6 这种情况下,写入者线程应该独占资源访问权:任何线程,无论是读取还是写入者线程,都不许访问

线程同步——用户模式下线程同步——关键段实现线程同步

1 //2.使用关键段实现线程同步 2 使用时必须有以下几个步骤 3 //(1)必须先定义 CRITICAL_SECTION 结构 4 CRITICAL_SECTION g_cs; 5 //(2)初始化关键段 CRITICAL_SECTION 6 InitializeCriticalSection(&g_cs); 7 //(3)在线程中调用 8 DWORD WINAPI ThreadFunOne(PVOID pvParam) 9 { 10 EnterCriticalSection(&g_c

Windows核心编程笔记(6)----用户模式下的线程同步

1.原子锁 使用InterlockedExchangeAdd函数来实现原子增长,InterlockedExchange\InterlockedExchangePointer用来交换两个变 量的值,InterlockedCompareExchange对比数值,相等则交换(对应的InterlockedCompareExchangePointer).对应的 还有64位函数. InterlockedIncrement\InterlockedDecrement是比较老的函数,只能增加或递减1,Interl

异步编程(二)用户模式线程同步

基元线程同步构造 多个线程同时访问共享数据时,线程同步能防止数据损坏.不需要线程同步是最理想的情况,因为线程同步存在许多问题. 第一个问题就是它比较繁琐,而且很容易写错. 第二个问题是,他们会损害性能.获取和释放锁是需要时间的. 第三个问题是,他们一次只允许一个线程访问资源,就可能导致其他线程被阻塞,使用多线程是为了提高效率,而阻塞无疑降低了你的效率. 综上所述,线程同步是一件不好的事情,所以在设计自己的应用程序时,应尽可能避免进行线程同步.具体就是避免使用像静态字段这样的共享数据.线程用new

linux内核同步之信号量、顺序锁、RCU、完成量、关闭中断【转】

转自:http://blog.csdn.net/goodluckwhh/article/details/9006065 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 一信号量 信号量的概念 信号量的数据结构和相关API 数据结构 初始化 获取和释放信号量 读写信号量的概念 读写信号量的数据结构 二顺序锁 顺序锁的概念 数据结构 写操作 读操作 三Read-Copy Update RCU 写操作 读操作 释放旧的版本 四完成量Completions 完成量的概念 数据结构

理解Windows内核模式与用户模式

 1.基础 运行 Windows 的计算机中的处理器有两个不同模式:"用户模式"和"内核模式".根据处理器上运行的代码的类型,处理器在两个模式之间切换.应用程序在用户模式下运行,核心操作系统组件在内核模式下运行.多个驱动程序在内核模式下运行,但某些驱动程序在用户模式下运行. 当启动用户模式的应用程序时,Windows 会为该应用程序创建"进程".进程为应用程序提供专用的"虚拟地址空间"和专用的"句柄表格"