当前位置:  开发笔记 > 小程序 > 正文

x86相当于LWARX和STWCX

如何解决《x86相当于LWARX和STWCX》经验,为你挑选了1个好方法。

我正在寻找相当于LWARX和STWCX(在PowerPC处理器上找到)或在x86平台上实现类似功能的方法.此外,哪里是最好的地方找到这样的事情(即锁定/等待免费编程的好文章/网站/论坛).


编辑
我想我可能需要提供更多细节,因为我假设我只是在寻找CAS(比较和交换)操作.我要做的是实现一个带有智能指针的无锁引用计数系统,可以通过多个线程访问和更改.我基本上需要一种在x86处理器上实现以下功能的方法.

int* IncrementAndRetrieve(int **ptr)
{
  int val;
  int *pval;
  do
  {
    // fetch the pointer to the value
    pval = *ptr;

    // if its NULL, then just return NULL, the smart pointer
    // will then become NULL as well
    if(pval == NULL)
      return NULL;

    // Grab the reference count
    val = lwarx(pval);

    // make sure the pointer we grabbed the value from
    // is still the same one referred to by  'ptr'
    if(pval != *ptr)
      continue;

    // Increment the reference count via 'stwcx' if any other threads
    // have done anything that could potentially break then it should
    // fail and try again
  } while(!stwcx(pval, val + 1));
  return pval;
}

我真的需要能够相当准确地模仿LWARX和STWCX的东西来解决这个问题(我无法找到一种方法来使用CompareExchange,交换或添加我迄今为止为x86找到的函数).

谢谢



1> johne..:

正如迈克尔所说,你可能正在寻找的是cmpxchg教学.

重要的是要指出,完成此操作的PPC方法称为加载链接/存储条件(LL/SC),而x86架构使用比较和交换(CAS).LL/SC具有比CAS更强的语义,因为对条件地址处的值的任何更改都将导致存储失败,即使其他更改使用与负载相关的相同值替换该值也是如此.另一方面,CAS在这种情况下会成功.这被称为ABA问题(有关详细信息,请参阅CAS链接).

如果您需要x86体系结构上更强大的语义,可以使用x86s双宽度比较和交换(DWCAS)指令cmpxchg8bcmpxchg16bx86_64 来近似它.这允许您一次原子地交换两个连续的"自然大小"单词,而不仅仅是通常的单词.基本思想是两个单词中的一个包含感兴趣的值,另一个包含一个总是递增的"变异计数".虽然这在技术上没有消除这个问题,但是突变计数器在尝试之间进行包装的可能性非常低,以至于它是大多数目的的合理替代品.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有