016 信号量 7

信号量

●  CreateSemaphore

  函数原型

1 HANDLE WINAPI CreateSemaphore(
2   _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
3   _In_     LONG                  lInitialCount,
4   _In_     LONG                  lMaximumCount,
5   _In_opt_ LPCTSTR               lpName
6 );

  ○ 参数1:lpSemaphoreAttributes [in, optional]
    指向SECURITY_ATTRIBUTES结构的指针。如果此参数为NULL,则处理不能由子进程继承。
  ○ 参数2:llInitialCount [in]
    这个信号量对象的初始计数。这个值必须大于或等于0,小于等于lMaximumCount。信号量的状态是当计数大于0时的信号,当它为零的时候没有信号。当等待函数释放等待信号量的线程时,计数会减少1。通过调用ReleaseSemaphore函数来增加指定数量的计数。
  ○ 参数3:llMaximumCount [in]
    这个信号量对象的最大计数。这个值必须大于零。
  ○ 参数4:lpName [in, optional]

    信号量对象的名称。名称长度限于MAX_PATH字符。名称比较是区分大小写的。

  ○ Return value 返回值:HANDLE
    如果函数成功,返回值是对信号量对象的句柄。如果在函数调用之前存在已命名的信号量对象,则函数返回现有对象的句柄,GetLastError返回error_already_存在。
    如果函数失败,返回值为NULL。要得到扩展的错误信息,请调用GetLastError。

●  OpenSemaphore

  函数原型

1 HANDLE WINAPI OpenSemaphore(
2   _In_ DWORD   dwDesiredAccess,
3   _In_ BOOL    bInheritHandle,
4   _In_ LPCTSTR lpName
5 );

  ○ 参数1:dwDesiredAccess [in]
    对信号量对象的访问。如果指定对象的安全描述符不允许调用进程的请求访问,则该函数失败。有关访问权限的列表.
  ○ 参数2:bInheritHandle [in]
    如果这个值是真的,这个进程创建的进程将继承这个句柄。否则,进程不会继承这个句柄。
  ○ 参数3:lpName [in]
    要打开的信号量的名称。名称比较是区分大小写的。
  ○ Return value 返回值:HANDLE
    如果函数成功,返回值是对信号量对象的句柄。
    如果函数失败,返回值为NULL。要得到扩展的错误信息,请调用GetLastError。

●  ReleaseSemaphore

  函数原型

1 BOOL WINAPI ReleaseSemaphore(
2   _In_      HANDLE hSemaphore,
3   _In_      LONG   lReleaseCount,
4   _Out_opt_ LPLONG lpPreviousCount
5 );

  ○ 参数1:HANDLE hSemaphore
    CreateSemaphore 或者 OpenSemaphore 返回的句柄
    SEMAPHORE_MODIFY_STATE权限。有关更多信息,请参见同步对象安全性和访问权限。
  ○ 参数2:LONG lReleaseCount
    用于增加信号量对象当前计数的量。值必须大于零。如果指定的数量会导致信号量的计数超过在创建信号量时指定的最大值,计数不会改变,函数返回FALSE。
  ○ 参数3:LPLONG lpPreviousCount
    一个指向一个变量的指针,以接收之前对信号量的计数。如果不需要以前的计数,该参数可以为空。

  ○ Return value 返回值:BOOL
    成功返回一个非零的数
    错误返回 0 使用GetLastError 获取错误信息

 1 #define UNICODE
 2 #include <stdio.h>
 3 #include <process.h>
 4 #include <windows.h>
 5
 6 //能够启动多少次
 7
 8 int main()
 9 {
10     //Semaphroe
11     // 计数 count 能够 wait多少次 每次使用wait 都会递减
12     HANDLE hSemaphroe = CreateSemaphore(nullptr, 0, 5, TEXT("Demo"));
13     //OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, TEXT("Demo"));
14     ReleaseSemaphore(hSemaphroe, 2, nullptr);
15     WaitForSingleObject(hSemaphroe, INFINITE);
16     WaitForSingleObject(hSemaphroe, INFINITE);
17     WaitForSingleObject(hSemaphroe, INFINITE);
18     WaitForSingleObject(hSemaphroe, INFINITE);
19     WaitForSingleObject(hSemaphroe, INFINITE);
20     WaitForSingleObject(hSemaphroe, INFINITE);
21     return 0;
22 }
时间: 2024-10-06 01:56:03

016 信号量 7的相关文章

信号量与并发控制

代码1 - 未使用信号量控制并发: #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ for (NSUInt

Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例

概要 本章,我们对JUC包中的信号量Semaphore进行学习.内容包括:Semaphore简介Semaphore数据结构Semaphore源码分析(基于JDK1.7.0_40)Semaphore示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3534050.html Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁". 信号量维护了一个信号量许可集.线程可以通过调用acquire()来获取信号量的许可

同步原语之信号量

一.semaphore信号量分析 首先,说明信号量的作用,信号量的作用类似于自旋锁(其实,同步原语均有相似之处),相似之处在于,都有临界区,各进程需互斥访问,linux中提供了两种信号量的实现,有内核态的和用户态的,这里只介绍内核态的 相关数据结构 1 struct semaphore { 2 spinlock_t lock; 3 unsigned int count; 4 struct list_head wait_list; 5 }; 1 struct mutex { 2 /* 1: unl

线程同步(条件变量、信号量)以及死锁

死锁:指两个或两个以上进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待现象,若无外力作用,它们都将无法继续推进下去. 例:交叉死锁:线程1获得了锁1,线程2获得了锁2,此时线程1调用lock想获得锁2,需挂起等待线程2释放锁2,而线程2也想获得锁1,也需挂起等待线程1释放锁1,此时两个线程都挂起等待 产生死锁的四个必要条件: (1):互斥条件(一个资源每次只能被一个进程或线程使用) (2):请求与保持条件(一个进程或线程因请求资源而阻塞时,对已获得的资源不释放) (3):不剥夺条件(此

信号量 (线程互斥)

信号量:表示可用资源的数量,MUTEX是非0即为1的, 即,如果信号量描述的资源数目是1时,此时的信号量和互斥锁相同! 调用sem_wait()可以获得资源(P操作),使semaphore的值减1,如果调用sem_wait()时 semaphore的值已经是0,则挂起等待.如果不希望挂起等待,可以调用sem_trywait() .调用 sem_post() 可以释放资源(V操作),使semaphore 的值加1,同时唤醒挂起等待的线程. 1.生产者不会把消费者套个圈 2.消费者不会超过生产者  

秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题 在<秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量>中对经典多线程同步互斥问题进行了回顾和总结,这篇文章对Windows系统下常用的线程同步互斥机制——关键段.事件.互斥量.信号量进行了总结.有网友问到互斥量能处理“遗弃”问题,事件和信号量是否也能处理“遗弃”问题.因此本文将对事件和信号量作个试验,看看事件和信号量能否处理“遗弃”问题. 一.

semget 信号量创建

Linux进程间通信(六)---信号量通信之semget().semctl().semop()及其用法:http://www.educity.cn/linux/1241661.html 信号量 Linux函数 semget();semctl();semop();:http://blog.csdn.net/ta893115871/article/details/7505560 信号量函数 semget() semop() semctl():http://blog.chinaunix.net/uid

[笔记][Java7并发编程实战手册]3.2 资源的并发访问控制Semaphore信号量

[笔记][Java7并发编程实战手册]系列目录 简介 本文学习信号量Semaphore机制. Semaphore 本质是一个共享锁 内部维护一个可用的信号集,获取信号量之前需要先申请获取信号数量:用完之后,则需要释放信号量:如果不释放,那么其他等待线程则一直阻塞直到获取信号量或则被中断为止 本人的理解是:互斥锁是同一时间只能一个线程访问,而在这里,是同一时间允许获取到了信号量的线程并发访问,而没有获取到信号量的则必须等待信号量的释放: 将信号量初始化为 1,使得它在使用时最多只有一个可用的许可,

20150218【改进信号量】IMX257实现GPIO-IRQ中断按键获取键值驱动程序

[改进信号量]IMX257实现GPIO-IRQ中断按键获取键值驱动程序 2015-02-18 李海沿 前面我们使用POLL查询方式来实现GPIO-IRQ按键中断程序 这里我们来使用信号量,让我们的驱动同时只能有一个应用程序打开. 一.首先在前面代码的基础上来一个简单的信号 1.定义一个全局的整形变量 2.在打开函数中,每次进入打开函数canopen都自减1, 3.当我们不使用时,在realease 中canopen自加1 4.这样就实现了一个简单的信号量,我们编译,测试 当我们使用两个应用程序来