Win32/VC|用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"<


编译,运行
【Win32/VC|用C++封装Win32信号量,同步线程】

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

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



    推荐阅读