在我尝试开发一个线程安全的 C++ 弱指针模板类时,我需要检查一个指示对象仍然存在的标志,如果是,则增加对象的引用计数,我需要以原子方式执行这两个步骤。
我知道编译器提供的内部函数的存在,例如 _InterlockedCompareExchange() 和 _InterlockedIncrement()。但我想要的是一个 interlockedCompareIncrement() 函数,有没有一种有效的方法来使用其他原语模拟这个内在函数,至少在 Windows x86 平台上是这样?
最佳答案
假设 value
是您的标志变量。它应该声明为 volatile
。
long curvalue;
long newvalue;
do
{
curvalue = value;
newvalue = curvalue + 1;
}
while( _InterlockedCompareExchange( &value, newvalue, curvalue ) != curvalue );
如您所见,您可以通过更改应用于计算 newvalue
的操作将其概括为您需要的任何类型的算术。
如果您想同时比较两个值,最好的办法是将两个值打包到一个变量中,然后对该变量进行操作。由于您使用的是结合引用计数的标志,我建议使用 value
的最低位作为“alive”标志,然后一次递增/递减 2。这允许您将标志和引用计数编码到单个 32 位变量中。
关于c++ - 如何原子地比较和递增?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2376862/