我开发了一些无锁数据结构并出现以下问题。
我有编写器线程,它在堆上创建对象并将它们包装在带有引用计数器的智能指针中。我也有很多读者线程,可以处理这些对象。代码可能如下所示:
SmartPtr ptr;
class Reader : public Thread {
virtual void Run {
for (;;) {
SmartPtr local(ptr);
// do smth
}
}
};
class Writer : public Thread {
virtual void Run {
for (;;) {
SmartPtr newPtr(new Object);
ptr = newPtr;
}
}
};
int main() {
Pool* pool = SystemThreadPool();
pool->Run(new Reader());
pool->Run(new Writer());
for (;;) // wait for crash :(
}
当我创建它的线程本地副本时ptr
,至少意味着
- 读取地址。
- 增加引用计数器。
我不能原子地执行这两个操作,因此有时我的读者会使用已删除的对象。
问题是 - 我应该使用什么样的智能指针来实现从多个线程进行读写访问并进行正确的内存管理?应该存在解决方案,因为Java程序员甚至不关心这样的问题,只是依靠所有对象都是引用并且只有在没有人使用它们时才被删除。
对于 PowerPC,我发现http://drdobbs.com/184401888看起来不错,但使用了 x86 中没有的 Load-Linked 和 Store-Conditional 指令。
据我了解,提升指针仅使用锁提供此类功能。我需要无锁解决方案。