Linux平台用C++实现信号量,同步线程

    使用Linux平台上现有的信号量sem_t相关的一组API,可以方便地进行线程同步。现在用pthread_mutex_t和pthread_cond_t相关的一组API实现信号量机制。这组API包括:pthread_mutex_init,pthread_cond_init,pthread_mutex_lock,pthread_cond_signal,pthread_mutex_unlock,pthread_cond_wait,pthread_cond_timedwait,pthread_cond_destroy和pthread_mutex_destroy,可以在http://www.9linux.com找到各API的说明。下边,是封装的信号量类,以及测试代码。使用VS2005编辑,在虚拟机 Fedora 13中编译,测试通过。

MySemaphore.h

#ifndef Semaphore_Header
#define Semaphore_Header

#include 
#include 
#include 
#include 

using namespace std;

//------------------------------------------------------------------------

class CSemaphoreImpl
{
protected:
	CSemaphoreImpl(int n, int max);		
	~CSemaphoreImpl();
	void SetImpl();
	void WaitImpl();
	bool WaitImpl(long lMilliseconds);

private:
	volatile int    m_n;
	int             m_max;
	pthread_mutex_t m_mutex;
	pthread_cond_t  m_cond;
};

inline void CSemaphoreImpl::SetImpl()
{
	if (pthread_mutex_lock(&m_mutex))	
		cout<<"cannot signal semaphore (lock)"<

MySemaphore.cpp

#include "MySemaphore.h"
#include 

CSemaphoreImpl::CSemaphoreImpl(int n, int max): m_n(n), m_max(max)
{
	assert (n >= 0 && max > 0 && n <= max);

	if (pthread_mutex_init(&m_mutex, NULL))
		cout<<"cannot create semaphore (mutex)"<= 1000000000)
	{
		abstime.tv_nsec -= 1000000000;
		abstime.tv_sec++;
	}

	if (pthread_mutex_lock(&m_mutex) != 0)
		cout<<"wait for semaphore failed (lock)"<

    下边是测试代码

// pthread_semaphore.cpp : 定义控制台应用程序的入口点。
//

#include "MySemaphore.h"


//创建一个信号量,其计数值当前值为0,最大值为3
CMySemaphore g_MySem(0, 3);

//线程函数
void * StartThread(void *pParam)
{
	//休眠1秒,确保主线程函数main中
	//创建工作线程下一句g_MySem.Set();先执行
	sleep(1);

	g_MySem.Wait(); //信号量计数值减1

	cout<<"Do print StartThread"<>iWait;
	return 0;
}

    编译,运行。可以看到,与Win32平台上的测试结果相同


    由此可见,信号量机制很关键的一点就是计数值 m_n。


原创作品,欢迎转载,麻烦带上链接:http://blog.csdn.net/chexlong/article/details/7098813 谢谢合作!



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