多线程(C++)同步Semaphore
来源:互联网 发布:java xss 字符串解决 编辑:程序博客网 时间:2024/05/17 02:15
多线程同步之Semaphore (主要解决生产者消费者问题)
一 信标Semaphore
信标内核对象用于对资源进行计数。它们与所有内核对象一样,包含一个使用数量,但是它们也包含另外两个带符号的3 2位值,一个是最大资源数量,一个是当前资源数量。最大资源数量用于标识信标能够控制的资源的最大数量,而当前资源数量则用于标识当前可以使用的资源的数量。
为了正确地说明这个问题,让我们来看一看应用程序是如何使用信标的。比如说,我正在开发一个服务器进程,在这个进程中,我已经分配了一个能够用来存 放客户机请求的缓冲区。我对缓冲区的大小进行了硬编码,这样它每次最多能够存放5个客户机请求。如果5个请求尚未处理完毕时,一个新客户机试图与服务器进 行联系,那么这个新客户机的请求就会被拒绝,并出现一个错误,指明服务器现在很忙,客户机应该过些时候重新进行联系。当我的服务器进程初始化时,它创建一 个线程池,里面包含5个线程,每个线程都准备在客户机请求到来时对它进行处理。
开始时,没有客户机提出任何请求,因此我的服务器不允许线程池中的任何线程成为可调度线程。但是,如果3个客户机请求同时到来,那么线程池中应该有 3个线程处于可调度状态。使用信标,就能够很好地处理对资源的监控和对线程的调度,最大资源数量设置为5,因为这是我进行硬编码的缓冲区的大小。当前资源 数量最初设置为0,因为没有客户机提出任何请求。当客户机的请求被接受时,当前资源数量就递增,当客户机的请求被提交给服务器的线程池时,当前资源数量就 递减。
信标的使用规则如下:
? 如果当前资源的数量大于0,则发出信标信号。
? 如果当前资源数量是0,则不发出信标信号。
? 系统决不允许当前资源的数量为负值。
? 当前资源数量决不能大于最大资源数量。
当使用信标时,不要将信标对象的使用数量与它的当前资源数量混为一谈。
二 API
三 实例
#include
#define
#define
HANDLE
DWORD
}
DWORD
}
- 多线程(C++)同步Semaphore
- 多线程(C++)同步Semaphore
- C语言多线程同步 -- 信号量semaphore.h
- 多线程同步-信号量(深入理解Semaphore)
- java多线程(三)-同步工具Semaphore
- QNX多线程同步之Semaphore
- Semaphore原型详细资料(多线程同步原语)
- WIN32多线程五 线程同步机制Semaphore(转)
- c用信号量(Semaphore)实现消费者生产者同步
- 多线程7:经典线程同步 信号量Semaphore
- java多线程同步工具之Semaphore信号灯
- 多线程之Semaphore实现线程同步
- 多线程之实现同步的信号量Semaphore
- C++多线程同步之Semaphore(信号量)
- 多线程(C++)同步Mutex
- 多线程(C++)同步Mutex
- 多线程同步(C++)event
- 多线程编程(12) - 多线程同步之 Semaphore (信号对象)
- c#基元类型
- oracle awr快速分析已知的sql
- 深入理解void类型
- 临界段——win32 API函数
- ajax那点事
- 多线程(C++)同步Semaphore
- C++Event机制的简单实现
- struts2 内建校验(email、regx等)报错,解决方法(jar包版本问题)!!!
- 如何解决从VBA中复制出的代码是乱码这一问题
- 多线程(C++)同步Mutex
- error opening trace file:No such file or drectory(2),Unable to start activity ComponentInfo
- 貌似被空格坑了
- 深入理解HTTP协议(转)
- 如何理解java中的依赖注入 通过构造函数和反射机制来实现的