模块无需互斥我需要一个线程安全的缓冲区对象以循环方式使用。我通常会在那里放置一个互斥体,以使增量和模数线程安全,但可以使用std :: atomic写入它吗?这里有一个示例界面。如果它使事情更容易,缓冲区的总数可以是2的幂。下一个缓冲区索引永远不会在类之外访问。C++线程安全增量模块使用std :: atomic
class Buffer;
class BufferManager
{
public:
BufferManager(size_t totalBuffers = 8) : mNextBufferIndex(0), mTotalBuffers(totalBuffers)
{
mBuffers = new Buffer*[mTotalBuffers];
}
Buffer* GetNextBuffer()
{
// How to make this operation atomic?
size_t index = mNextBufferIndex;
mNextBufferIndex = (mNextBufferIndex + 1) % mTotalBuffers;
return mBuffers[index];
}
private:
Buffer** mBuffers;
size_t mNextBufferIndex;
size_t mTotalBuffers;
};
啊,这是有道理的 - 下一个缓冲区索引实际上并不需要*需要模数,只有在线程安全的情况下才会增加。只要mNextBufferIndex的类型的最大值大于或等于mTotalBuffers(就像这里),这就好了。谢谢。 – Steven
OP可能没问题,但它与原子操作或互斥体内的整个操作完全不同。 – SergeyA
@SergeyA我不清楚,你是对的 - 我认为这是正确的答案。 – Steven