用C++封装Win32信号量,同步线程

     在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"<


    编译,运行

 

    可见,在不同的线程,这里是主线程函数main和工作线程函数StartThread都可以对信号量对象g_MySem做 P操作。

 

    欢迎转载,麻烦带上连接http://blog.csdn.net/chexlong/article/details/7089287 谢谢合作!

 

 

 

你可能感兴趣的:(Win32/VC,并行编程,C/C++)