苗条的读者作家锁Raii

时间:2014-10-06 15:36:42

标签: c++ windows multithreading

我有一个使用多个线程处理请求的Windows服务器应用程序。我需要一个读写器锁来保护对共享std::unordered_map的访问权限;我希望以类似于std::unique_lock的方式执行此操作(资源获取是初始化)。所以我想出了这个SRWRaii课程。

class SRWRaii
{
public:
    SRWRaii(const SRWLOCK& lock, bool m_exclusive = false)
        :m_lock(lock), m_exclusive(m_exclusive) 
    {
        if (m_exclusive)
        {
            AcquireSRWLockExclusive(const_cast<SRWLOCK*>(&m_lock));
        }
        else
        {
            AcquireSRWLockShared(const_cast<SRWLOCK*>(&m_lock));
        }
    }

    ~SRWRaii()
    {
        if (m_exclusive)
        {
            ReleaseSRWLockExclusive(const_cast<SRWLOCK*>(&m_lock));
        }
        else
        {
            ReleaseSRWLockShared(const_cast<SRWLOCK*>(&m_lock));
        }
    }
private:
    const SRWLOCK& m_lock;
    bool m_exclusive;
};

然后我按如下方式使用

SRWLOCK g_mutex;
void Initialize()
{
    InitializeSRWLock(&g_mutex);
}

void Reader()
{
    SRWRaii lock(g_mutex);
    // Read from unordered_map
}

void Writer()
{
    SRWRaii lock(g_mutex, true); // exclusive
    // add or delete from unordered_map
}

鉴于我对c ++的新手,我对这个关键代码有点怀疑。在SRWLOCK上实现Raii包装器的上述方法是否存在问题?可以对上面的代码做些什么改进?

0 个答案:

没有答案