通過互斥量和讀寫鎖來實現進程間通信

    一個簡單的進程間鎖的例子,通過在父進程聲明,然後在fork出來的子進程變可以使用這個鎖的對象來進程數據訪問的互斥控制。直接看代碼吧。。

#ifndef _SHARE_LOCK_H_
#define _SHARE_LOCK_H_
//進程間mutex,在父進程定義,fork之後加鎖解鎖對父子進程間有效
class ShareMutex
{
	public:
		ShareMutex::ShareMutex();
		ShareMutex::~ShareMutex();
		void Lock();
		void UnLock();
	private:
		pthread_mutex_t* m_pMutex;
};

//進程間讀寫鎖,fork之後加鎖解鎖對父子進程間有效
class ShareRwlock
{
	public:
		ShareRwlock::ShareRwlock();
		ShareRwlock::~ShareRwlock();
		void WrLock();
		void RdLock();
		void UnLock();
	private:
		pthread_rwlock_t* m_pRwlock;
};
#endif

#include "ShareMutex.h"

ShareMutex::ShareMutex()
{
    m_pMutex = (pthread_mutex_t *)mmap(NULL, sizeof(pthread_mutex_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
    pthread_mutexattr_t attr_perf;
    pthread_mutexattr_init(&attr_perf));
    pthread_mutexattr_setpshared(&attr_perf, PTHREAD_PROCESS_SHARED);
    pthread_mutex_init(g_perf_mutex, &attr_perf);    
}


ShareMutex::~ShareMutex()
{
    m_pRwLocked_mutex_destroy(m_pMutex);
    munmap(m_pMutex, sizeof(pthread_mutex_t));
}

//www.it165.net
void ShareMutex::Lock()
{
    if(0 != pthread_mutex_lock(m_pMutex))
    {
        throw TCException("ShareMutex::Lock() exception!");
    }
}


void ShareMutex::UnLock()
{
    if(0 != pthread_mutex_unlock(m_pMutex))
    {
        throw TCException("ShareMutex::UnLock() exception!");
    }
}


ShareRwlock::ShareRwlock()
{
    m_pRwlock = (pthread_rwlock_t *)mmap(NULL, sizeof(pthread_rwlock_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
    pthread_rwlockattr_t attr_pub; 
    pthread_rwlockattr_init( &attr_pub ); 
    pthread_rwlockattr_setpshared( &attr_pub, PTHREAD_PROCESS_SHARED ); 
    pthread_rwlock_init( m_pRwLock, &attr_pub );
}


ShareRwlock::~ShareRwlock()
{
    pthread_rwlock_destroy(m_pRwlock);
    munmap(m_pRwlock, sizeof(pthread_rwlock_t));
}


void ShareRwlock::WrLock()
{
    if(0 != pthread_rwlock_wrlock( m_pRwLock ))
    {
        throw TCException("ShareRwlock::WrLock() exception!");
    }
}


void ShareRwlock::RdLock()
{
    if(0 != pthread_rwlock_rdlock( m_pRwLock ))
    {
        throw TCException("ShareRwlock::RdLock() exception!");
    }
}


void ShareRwlock::UnLock()
{
    if(0 != pthread_rwlock_unlock( m_pRwLock ))
    {
        throw TCException("ShareRwlock::UnLock() exception!");
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章