在Win32环境下编写多线程应用程序,也会常用到信号量Semaphore来进行线程同步。与其相关的一组API包括:CreateSemaphore,ReleaseSemaphore,WaitForSingleObject,和CloseHandle。关于这些API的功能以及参数意义等这里就不多说了。下边,我封装了一个信号量类,以及测试代码。已由本人在VS2005环境下编译,测试通过。
MySemaphore.h
#ifndef Semaphore_Header
#define Semaphore_Header#include
#include
#include using namespace std;
//------------------------------------------------------------------------class CSemaphoreImpl
{
protected:
CSemaphoreImpl(int n, int max);
~CSemaphoreImpl();
void SetImpl();
void WaitImpl();
bool WaitImpl(long lMilliseconds);
private:
HANDLE m_hSema;
};
inline void CSemaphoreImpl::SetImpl()
{
if (!ReleaseSemaphore(m_hSema, 1, NULL))
{
cout<<"cannot signal semaphore"<
MySemaphore.cpp
#include "MySemaphore.h"CSemaphoreImpl::CSemaphoreImpl(int n, int max)
{
assert (n >= 0 && max > 0 && n <= max);
m_hSema = CreateSemaphore(NULL, n, max, NULL);
if (!m_hSema)
{
cout<<"cannot create semaphore"<
下边是测试代码
// MySem.cpp : 定义控制台应用程序的入口点。
//#include "MySemaphore.h"
#include //创建一个信号量,其计数值当前值为0,最大值为3
CMySemaphore g_MySem(0, 3);
//线程函数
unsigned int __stdcall StartThread(void *pParam)
{
//休眠100毫秒,确保主线程函数main中
//创建工作线程下一句g_MySem.Set();
先执行
Sleep(100);
g_MySem.Wait();
//信号量计数值减1 cout<<"Do print StartThread"<
编译,运行
【Win32/VC|用C++封装Win32信号量,同步线程】
可见,在不同的线程,这里是主线程函数main和工作线程函数StartThread都可以对信号量对象g_MySem做 P操作。
欢迎转载,麻烦带上连接http://blog.csdn.net/chexlong/article/details/7089287 谢谢合作!