【发布时间】:2011-11-04 09:30:33
【问题描述】:
我开发了一些无锁数据结构,但出现了以下问题。
我有编写器线程,它在堆上创建对象并将它们包装在带有引用计数器的智能指针中。我也有很多读者线程,可以处理这些对象。代码可能如下所示:
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 中没有的加载链接和存储条件指令。
据我了解,boost 指针仅使用锁提供此类功能。我需要无锁解决方案。
【问题讨论】:
-
std::shared_ptr? (或者,boost::shared_ptr如果您的实现还不支持它。) -
boost::shared_ptr有什么问题吗? -
我很确定 JVM 使用了锁。执行速度是您想要避免锁定的原因吗?检查之前的问题,例如 c:\Code\boost_1_47_0\boost;但我想知道您是否不必选择基于锁定的解决方案、依赖于特定指令或 C++11 语言支持的解决方案,或者不安全的解决方案,例如您正在使用的解决方案。
-
为什么要无锁?它是您应用的瓶颈吗?
-
我认为 std::shared_ptr 不支持原子分配。
标签: c++ thread-safety x86 smart-pointers lock-free