windows核心编程-信号量内核对象

来源:互联网 发布:网络男歌手比较慢的歌 编辑:程序博客网 时间:2024/05/06 19:03

信号量内核对象用来对资源进行计数。与其他内核对象不同的是,它还包含了两个32位值:一个最大资源计数和一个当前资源计数。

最大资源表示信号量可以控制的最大资源数量,当前资源计数表示信号量当前可用的资源的数量。

HANDLE WINAPI CreateSemaphore(  _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,  //安全属性  _In_     LONG                  lInitialCount,   //表示这些资源一开始有多少个可供使用  _In_     LONG                  lMaximumCount,   //能够处理的资源最大数量  _In_opt_ LPCTSTR               lpName     );
当前资源计数大于零:信号量处于触发状态

等于零:未触发状态


可以用OpenSemaphore来得到已经存在的信号量的句柄

HANDLE WINAPI OpenSemaphore(  _In_ DWORD   dwDesiredAccess,  _In_ BOOL    bInheritHandle,  _In_ LPCTSTR lpName);

HANDLE hSemaphore =CreateSemaphore(NULL,0,5,NULL);

创建一个信号量,最大资源数为5,但是一开始只有0个资源可供使用,所以信号量未被触发。

信号量最大的优势是他们会以原子方式来执行这些设置和操作,也就是说,当我们向信号量请求

一个资源的时候,操作系统会检查资源是否可用,并将资源的数量递减,整个过程不会被线程打断。

只有当资源计数递减完成之后,系统才会允许另一个线程请求对资源的访问。


线程通过ReleaseSemaphore来递增信号量的当前资源计数

BOOL WINAPI ReleaseSemaphore(  _In_      HANDLE hSemaphore,  _In_      LONG   lReleaseCount,  _Out_opt_ LPLONG lpPreviousCount);
这个函数只是把IReleaseCount的值加到信号量的当前资源计数上。通常我们会传1给IReleaseCount函数,
但是很少有程序用到它,所以可以直接传NULL忽略它。



0 0
原创粉丝点击