因爲最近一直在做程序使用共享內存的改造,自然也就涉及到進程間同步的問題,以下是一個簡單的進程間鎖的例子,通過在父進程聲明,然後在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!");
- }
- }