使用 Boost.Threads 的读写锁(如何转换这个简单的类)

Posted

技术标签:

【中文标题】使用 Boost.Threads 的读写锁(如何转换这个简单的类)【英文标题】:ReadWrite lock using Boost.Threads (how to convert this simple class) 【发布时间】:2010-02-18 13:55:55 【问题描述】:

我正在将一些代码从 Windows 移植到 Linux (Ubuntu 9.10)。我有一个简单的类(请参见下文),它使用 windows 函数来实现简单的互斥锁。我想使用 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__

【问题讨论】:

你应该做的一个改变是在你的包含保护名称中——包含双下划线的名称在 C++ 中被保留——你不能在你自己的代码中创建它们。 Neil,C 代码中是否允许使用它们? [让我不必在谷歌上搜索](我也在一些 C 代码中使用它们) 【参考方案1】:

我不会为你重写所有代码。但是,您应该查看 boost 的 shared_mutex 类。

另外,来自 *** 的 question 展示了如何使用 boost::shared_mutex

【讨论】:

@Glen:我并不是建议你为我编写整个代码(别想了!)。不过感谢您提供的链接,这正是我需要开始的,从那里开始应该是轻而易举的事。

以上是关于使用 Boost.Threads 的读写锁(如何转换这个简单的类)的主要内容,如果未能解决你的问题,请参考以下文章

Boost Threads Producer/Consumer 意外行为

锁,同步,可重入锁,读写锁(转)

java 锁 简介(转)

可重入锁 公平锁 读写锁

java锁有哪些类(转)

在多线程C ++应用程序中,我是否需要一个互斥锁来保护一个简单的布尔值?