我有一个使用多个线程处理请求的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包装器的上述方法是否存在问题?可以对上面的代码做些什么改进?