gpt4 book ai didi

c++ - 如何使用 C++11 实现指向整数的指针的原子增量?

转载 作者:IT老高 更新时间:2023-10-28 23:15:42 26 4
gpt4 key购买 nike

在将一些 Windows C++ 代码移植到 iOS 时,我需要提供 Win32 的 long InterlockedIncrement(long *p) 的实现。称呼。使用 <libkern/OSAtomic.h> 中定义的函数,这很容易。 .

但是,我想知道是否可以仅使用 C++11 工具以与操作系统无关的方式编写它,主要是 <atomic> .我想出了这个,我不确定它是否能实现我想要的:

inline long InterlockedIncrement(long* p)
{
std::atomic<long&> atomicP(*p);
return ++atomicP;
}

这行得通吗?这够好吗?这两行不是原子的,但是增量应该是原子的,这是这里的关键。

<atomic> 的所有使用示例我发现是不同的,其中 std::atomic<T>被定义并直接使用。在这里,我想使用调用者通过地址传递给我的现有长变量。我找不到这样的例子。

编辑:Clang 3.2(在 Xcode 4.x 中)无法编译 ++atomicP出现错误“无法增加 std::atomic<long&> 类型的值”(也不是 atomicP += 1)。

正确的方法是什么?

再次编辑:指针实现编译...

inline long InterlockedIncrement(long* p)
{
std::atomic<long*> atomicP(p);
return ++(*atomicP);
}

但恐怕这行不通,因为我不增加原子类型,而是指针指向的值,它不是原子的。

最佳答案

您的示例实现每次都从指针构造一个新的原子。这不是 std::atomic 的预期用途,我不相信它会按照您的意愿工作。

据我所知,做您想做的事情的唯一方法(以独立于平台的方式消除对 InterlockedIncrement 的依赖)是用 std 替换您当前调用 Win32“互锁”调用的变量的所有声明: :它们的原子版本。然后,您可以删除互锁调用并使用常规值语义以原子方式修改变量。无论如何,这更具可读性(并且将来更易于维护)。

我了解您希望保留现有的(经过良好测试的)代码,但我认为您不能这样做。

关于c++ - 如何使用 C++11 <atomic> 实现指向整数的指针的原子增量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13399329/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com