我正在寻找相当于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找到的函数).
谢谢
正如迈克尔所说,你可能正在寻找的是cmpxchg
教学.
重要的是要指出,完成此操作的PPC方法称为加载链接/存储条件(LL/SC),而x86架构使用比较和交换(CAS).LL/SC具有比CAS更强的语义,因为对条件地址处的值的任何更改都将导致存储失败,即使其他更改使用与负载相关的相同值替换该值也是如此.另一方面,CAS在这种情况下会成功.这被称为ABA问题(有关详细信息,请参阅CAS链接).
如果您需要x86体系结构上更强大的语义,可以使用x86s双宽度比较和交换(DWCAS)指令cmpxchg8b
或cmpxchg16b
x86_64 来近似它.这允许您一次原子地交换两个连续的"自然大小"单词,而不仅仅是通常的单词.基本思想是两个单词中的一个包含感兴趣的值,另一个包含一个总是递增的"变异计数".虽然这在技术上没有消除这个问题,但是突变计数器在尝试之间进行包装的可能性非常低,以至于它是大多数目的的合理替代品.