我想创建一个线程安全的写时复制对象。我想要一个函数makeUnique
来检查引用计数器:如果它是1,它什么都不做。如果它不是1,则它克隆数据。一个基本的非线程安全实现可能是这样的:
class COW {
private:
struct Data {
int refCount;
// various other members
};
Data *m_data;
public:
void makeUnique() {
if (m_data->refCount!=1) {
Data *newData = m_data->clone(); // returns a cloned data, with refCount==1
decRef(m_data);
m_data = newData;
}
}
};
哪种方法可以使这种线程安全?我的目标是x86和ARMv7 +。
基本上,我认为我需要一个原子“比较和减少”操作,这可以通过循环中的比较和交换来完成。有没有更高效的方法(考虑我的目标平台)?