gpt4 book ai didi

c++ - 这个 C++ AtomicInt 实现正确吗?

转载 作者:行者123 更新时间:2023-12-02 03:16:46 26 4
gpt4 key购买 nike

前提:我正在使用 ARM 嵌入式(几乎是裸机)环境,我什至没有可用的 C++11(带有 std::atomic<int> ),所以请避免像“只是使用标准 C++ std::atomic<int> ”:我不能

这是ARM吗implementation AtomicInt 正确吗? (假设ARM架构为ARMv7-A)

您发现一些同步问题吗?是volatile需要/有用吗?

// File: atomic_int.h

#ifndef ATOMIC_INT_H_
#define ATOMIC_INT_H_

#include <stdint.h>

class AtomicInt
{
public:
AtomicInt(int32_t init = 0) : atom(init) { }
~AtomicInt() {}

int32_t add(int32_t value); // Implement 'add' method in platform-specific file

int32_t sub(int32_t value) { return add(-value); }
int32_t inc(void) { return add(1); }
int32_t dec(void) { return add(-1); }

private:
volatile int32_t atom;
};

#endif
// File: arm/atomic_int.cpp

#include "atomic_int.h"

int32_t AtomicInt::add(int32_t value)
{
int32_t res, prev, tmp;

asm volatile(

"try: ldrex %1, [%3]\n" // prev = atom;
" add %0, %1, %4\n" // res = prev + value;
" strex %2, %0, [%3]\n" // tmp = outcome(atom = res); // may fail
" teq %2, #0\n" // if (tmp)
" bne try" // goto try; /* add failed: someone else modified atom -> retry */

: "=&r" (res), "=&r" (prev), "=&r" (tmp), "+mo" (atom) // output (atom is both in-out)
: "r" (value) // input
: "cc"); // clobbers (condition code register [CPSR] changed)

return prev; // safe return (local variable cannot be changed by other execution contexts)
}

此外,我正在尝试实现一些代码重用,这就是为什么我只隔离了一个基本函数以在特定于平台的代码中实现( add() 内的 arm/atomic_int.cpp 方法)。

atomic_int.h真的可移植,因为它可以跨不同的平台/架构/编译器?这种方法可行吗? (“可行”是指每个平台都可以通过实现 add() 方法来保证原子性)。

here是相同功能的相应ARM GCC 8.3.1实现。显然,唯一真正的区别是 dmb 的存在。之前和之后。我的情况真的需要它们吗?为什么?你有一个例子,我的 AtomicInt (没有 dmb )失败?

更新:修复了实现,已删除 get()解决原子性和对齐问题的方法。现在add()行为类似于标准 fetchAndAdd() .

最佳答案

如果您使用gcc,您可能可以使用Legacy __sync Built-in Functions for Atomic Memory Access :

void add(int volatile& a, int value) {
__sync_fetch_and_add(&a, value);
}

Generates :

add(int volatile&, int):
.L2:
ldxr w2, [x0]
add w2, w2, w1
stlxr w3, w2, [x0]
cbnz w3, .L2
dmb ish
ret

关于c++ - 这个 C++ AtomicInt 实现正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58339181/

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