首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >64位指针的无锁内存回收

64位指针的无锁内存回收
EN

Stack Overflow用户
提问于 2009-06-30 05:35:09
回答 7查看 4.4K关注 0票数 4

赫利希和沙维特的书“内存回收的解决方案”(The Art of Multiprocessor Programming)使用了Java的AtomicStampedReference<T>;

要在C++中为x86_64写一个,我想至少需要12个字节的交换操作--8个字节用于64位指针,4个字节用于int。

是否有x86硬件对此的支持?如果没有,有任何关于如何在没有它的情况下进行无等待内存回收的建议?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-06-30 08:13:07

是的,有硬件支持,但我不知道它是否由C++库公开。无论如何,如果您不介意做一些低级的不可移植的汇编语言技巧-请查阅英特尔手册中的CMPXCHG16B指令。

票数 3
EN

Stack Overflow用户

发布于 2009-06-30 05:46:29

Windows给你提供了一堆原子的Interlocked functions,可能可以用来做你想做的事情。其他平台也有类似的函数,我相信Boost也有一个互锁的库。

你的问题不是很清楚,而且我没有赫利希和沙维特的复印件。也许如果你详述或者给出你想要做什么的psuedo代码,我们可以给你一个更具体的答案。

票数 3
EN

Stack Overflow用户

发布于 2009-06-30 06:26:38

希望我能拿到那本书

对于其他可能提供答案的人,重点是实现这个类:

代码语言:javascript
复制
class AtomicReference<T>{
  public:
    void set(T *ref, int stamp){ ... }
    T *get(int *stamp){ ... }
  private:  
    T *_ref; 
    int _stamp; 

};

以一种无锁的方式:

set stamp ()更新引用和戳记,atomicly.

  • get()返回引用并将*
  • 设置为与引用对应的戳记。

JDonner,如果我错了,请纠正我。

现在我的回答是:我认为你不能在没有锁的情况下做到这一点(锁可以是while(test_and_set() != ..))。因此,没有针对这一点的无锁算法。这意味着有可能以一种对任何N个都无锁的方式构建一个N- N. to寄存器。

如果你看一下杂注9.8.1这本书,AtomicMarkableReference是相同的,只有一位而不是整数戳。作者建议从指针中“窃取”一位,以从单个单词(也是引号最大的单词)中提取标记和指针。这显然意味着他们想要使用单个原子寄存器来执行此操作。

然而,可能有一种方法可以在没有等待的情况下实现无等待内存回收。我不知道。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1061889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档