2010-02-18 43 views
0

我將一些代碼從windows移植到Linux(Ubuntu 9.10)。我有一個簡單的類(請參閱下文),它使用Windows函數來實現簡單的互斥鎖。我想用Boost.Threads來重新實現這個,但那個庫對我來說是新的。ReadWrite使用Boost.Threads鎖(如何轉換這個簡單的類)

有人可以指出我需要對下面的類進行更改,爲了使用Boost.Threads而不是WIN特定的函數嗎?

#ifndef __my_READWRITE_LOCK_Header__ 
#define __my_READWRITE_LOCK_Header__ 

#include <windows.h> 

//Simple RW lock implementation is shown below. 

#define RW_READERS_MAX 10 
#define RW_MAX_SEMAPHORE_COUNT 10 
#define RW_MUTEX_NAME  L"mymutex" 
#define RW_SEMAPHORE_NAME L"mysemaphore" 
class CThreadRwLock 
{ 
public: 
    CThreadRwLock() 
    { 
     InitializeCriticalSection(&m_cs); 
     m_hSem = CreateSemaphore(0, RW_READERS_MAX, RW_READERS_MAX, 0);  
    } 

    ~CThreadRwLock() 
    { 
     DeleteCriticalSection(&m_cs); 
     CloseHandle(m_hSem); 
    } 

    void AcquireReaderLock() 
    { 
     EnterCriticalSection(&m_cs); 
     WaitForSingleObject(m_hSem, INFINITE); 
     LeaveCriticalSection(&m_cs); 
    } 

    void AcquireWriterLock() 
    { 
     EnterCriticalSection(&m_cs); 
     for(int i = 0; i < RW_READERS_MAX; i++) 
     { 
      WaitForSingleObject(m_hSem, INFINITE);   
     } 
     LeaveCriticalSection(&m_cs); 
    } 

    void ReleaseReaderLock() 
    { 
     ReleaseSemaphore(m_hSem, 1, 0); 
    } 


    void ReleaseWriterLock() 
    { 
     ReleaseSemaphore(m_hSem, RW_READERS_MAX, 0); 
    } 

private: 
    CRITICAL_SECTION m_cs; 
    HANDLE    m_hSem; 
}; 




class CProcessRwLock 
{ 
public: 
    CProcessRwLock() 
    { 
     m_h = CreateMutex(NULL, FALSE, RW_MUTEX_NAME); 
     m_hSem = CreateSemaphore(NULL, RW_MAX_SEMAPHORE_COUNT, RW_MAX_SEMAPHORE_COUNT, RW_SEMAPHORE_NAME); 
    } 

    ~CProcessRwLock() 
    { 
     CloseHandle(m_h); 
    } 

    void AcquireReaderLock() 
    { 
     WaitForSingleObject(m_h, INFINITE); 
     ReleaseMutex(m_h); 
    } 

    void AcquireWriterLock() 
    { 
     WaitForSingleObject(m_h, INFINITE); 
     for(int i = 0; i < RW_READERS_MAX; i++) 
     { 
      WaitForSingleObject(m_hSem, INFINITE);   
     } 
     ReleaseMutex(m_h); 
    } 

    void ReleaseReaderLock() 
    { 
     ReleaseSemaphore(m_hSem, 1, 0); 
    } 


    void ReleaseWriterLock() 
    { 
     ReleaseSemaphore(m_hSem, RW_READERS_MAX, 0); 
    } 

private: 
    HANDLE    m_h, m_hSem; 
}; 


class AutoThreadRwLock 
{ 
public: 
    AutoThreadRwLock(const bool readlock = true):m_readlock(readlock) 
    { 
     if (readlock) 
      m_lock.AcquireReaderLock(); 
     else 
      m_lock.AcquireWriterLock(); 
    } 

    ~AutoThreadRwLock() 
    { 
     if (m_readlock) 
      m_lock.ReleaseReaderLock(); 
     else 
      m_lock.ReleaseWriterLock(); 
    } 

private: 
    AutoThreadRwLock(const AutoThreadRwLock&); 
    AutoThreadRwLock& operator= (const AutoThreadRwLock&); 

    CThreadRwLock m_lock ; 
    bool m_readlock ; 
}; 


class AutoProcessRwLock 
{ 
public: 
    AutoProcessRwLock(const bool readlock = true): m_readlock(readlock) 
    { 
     if (readlock) 
      m_lock.AcquireReaderLock(); 
     else 
      m_lock.AcquireWriterLock(); 
    } 

    ~AutoProcessRwLock() 
    { 
     if (m_readlock) 
      m_lock.ReleaseReaderLock(); 
     else 
      m_lock.ReleaseWriterLock(); 
    } 

private: 
    AutoProcessRwLock(const AutoProcessRwLock&); 
    AutoProcessRwLock& operator= (const AutoProcessRwLock&); 

    CProcessRwLock m_lock ; 
    bool m_readlock ; 
}; 

#endif //__my_READWRITE_LOCK_Header__ 
+1

一個變化是在包括後衛的名字 - 你不能創建它們 - 含雙下劃線的名稱被保留在C++在你自己的代碼中。 – 2010-02-18 13:57:49

+0

尼爾,他們是否允許使用C代碼? [我可以節省我不得不穀歌來查看這個](我在一些C代碼中也使用它們) – 2010-02-18 14:23:10

回答

2

我不會爲你重寫所有的代碼。不過你應該看看助手的shared_mutex課程。

此外,這question從StackOverflow上展示瞭如何使用一個boost :: shared_mutex你應該讓

+0

@Glen:我並不是建議你爲我寫整個代碼(根本不存在!)。感謝這個鏈接,雖然這是我需要開始的,但從那裏開始應該是一件輕而易舉的事情。 – 2010-02-18 14:38:06