c++ - 如何原子地比较和递增?

标签 c++ multithreading thread-safety weak-references lock-free

在我尝试开发一个线程安全的 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/

相关文章:

multithreading - 并行算法实现建议

c++ - 并发 std::vector 写入的效率

c++ - 如何模拟 Google Test 中公共(public)方法正在使用的类中的私有(private)方法?

c++ - 定义值并通过数组调用它们

c++ - C++ 中迭代器的运算符

python - 有什么方法可以减小 python 2.7.6 数据包的大小(不需要的文件夹或不需要的文件夹或 python 包中不需要的文件夹))

c++ - 使用 std::adopt_lock 选项构造后,std::lock_guard 是否释放互斥锁?

Java 线程安全的 LinkedHashMap 实现?

multithreading - 线程安全可以被忽略吗?

random - 这是一个适当的线程安全随机包装器吗?