赫利希和沙维特的书“内存回收的解决方案”(The Art of Multiprocessor Programming)使用了Java的AtomicStampedReference<T>;。
要在C++中为x86_64写一个,我想至少需要12个字节的交换操作--8个字节用于64位指针,4个字节用于int。
是否有x86硬件对此的支持?如果没有,有任何关于如何在没有它的情况下进行无等待内存回收的建议?
发布于 2009-06-30 08:13:07
是的,有硬件支持,但我不知道它是否由C++库公开。无论如何,如果您不介意做一些低级的不可移植的汇编语言技巧-请查阅英特尔手册中的CMPXCHG16B指令。
发布于 2009-06-30 05:46:29
Windows给你提供了一堆原子的Interlocked functions,可能可以用来做你想做的事情。其他平台也有类似的函数,我相信Boost也有一个互锁的库。
你的问题不是很清楚,而且我没有赫利希和沙维特的复印件。也许如果你详述或者给出你想要做什么的psuedo代码,我们可以给你一个更具体的答案。
发布于 2009-06-30 06:26:38
希望我能拿到那本书
对于其他可能提供答案的人,重点是实现这个类:
class AtomicReference<T>{
public:
void set(T *ref, int stamp){ ... }
T *get(int *stamp){ ... }
private:
T *_ref;
int _stamp; };
以一种无锁的方式:
set stamp ()更新引用和戳记,atomicly.
JDonner,如果我错了,请纠正我。
现在我的回答是:我认为你不能在没有锁的情况下做到这一点(锁可以是while(test_and_set() != ..))。因此,没有针对这一点的无锁算法。这意味着有可能以一种对任何N个都无锁的方式构建一个N- N. to寄存器。
如果你看一下杂注9.8.1这本书,AtomicMarkableReference是相同的,只有一位而不是整数戳。作者建议从指针中“窃取”一位,以从单个单词(也是引号最大的单词)中提取标记和指针。这显然意味着他们想要使用单个原子寄存器来执行此操作。
然而,可能有一种方法可以在没有等待的情况下实现无等待内存回收。我不知道。
https://stackoverflow.com/questions/1061889
复制相似问题