gpt4 book ai didi

c++ - 如何使用 CSingleLock 提供对此缓冲区的访问权限?

转载 作者:行者123 更新时间:2023-11-27 23:34:55 25 4
gpt4 key购买 nike

我有这两种方法来以线程独占方式访问 CMyBuffer 对象:

标题:

class CSomeClass
{
//...
public:
CMyBuffer & LockBuffer();
void ReleaseBuffer();

private:
CMyBuffer m_buffer;
CCriticalSection m_bufferLock;
//...
}

实现:

CMyBuffer & CSomeClass::LockBuffer()
{
m_bufferLock.Lock();
return m_buffer;
}

void CSomeClass::ReleaseBuffer()
{
m_bufferLock.Unlock();
}

用法:

void someFunction(CSomeClass & sc)
{
CMyBuffer & buffer = sc.LockBuffer();
// access buffer
sc.ReleaseBuffer();
}
  • 我喜欢的是,用户只需执行一个功能调用并且只能访问缓冲区锁定后。
  • 我不做的事喜欢的是用户必须释放明确地。

更新:Nick Meyer 和 Martin York 指出了这些额外的缺点:

  • 用户可以释放锁然后使用缓冲区。
  • 如果在释放锁之前发生异常,缓冲区保持锁定状态。

我想用 CSingleLock 对象(或类似的东西)来实现它,它会在对象超出范围时解锁缓冲区。

那怎么可能呢?

最佳答案

一种方法是使用 RAII :

class CMyBuffer
{
public:
void Lock()
{
m_bufferLock.Lock();
}

void Unlock()
{
m_bufferLock.Unlock();
}

private:
CCriticalSection m_bufferLock;

};

class LockedBuffer
{
public:
LockedBuffer(CMyBuffer& myBuffer) : m_myBuffer(myBuffer)
{
m_myBuffer.Lock();
}

~LockedBuffer()
{

m_myBuffer.Unlock();
}

CMyBuffer& getBuffer()
{
return m_myBuffer;
}

private:
CMyBuffer& m_myBuffer;

};

class CSomeClass
{
//...
public:
LockedBuffer getBuffer();

private:
CMyBuffer m_buffer;

};


LockedBuffer CSomeClass::getBuffer()
{
return LockedBuffer(m_buffer);
}

void someFunction(CSomeClass & sc)
{
LockedBuffer lb = sc.getBuffer();
CMyBuffer& buffer = lb.getBuffer();
//Use the buffer, when lb object goes out of scope buffer lock is released
}

关于c++ - 如何使用 CSingleLock 提供对此缓冲区的访问权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1255430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com