gpt4 book ai didi

c++ - ARM 上的 std::atomic 无锁不一致(树莓派 3)

转载 作者:行者123 更新时间:2023-12-03 06:51:46 25 4
gpt4 key购买 nike

我有一个静态断言的问题。静态断言完全是这样的:

static_assert(std::atomic<bool>::is_always_lock_free);
并且代码在 Raspberry Pi 3 上失败(Linux raspberrypi 4.19.118-v7+ #1311 SMP Mon Apr 27 14:21:24 BST 2020 armv7l GNU/Linux)。
关于 cppreference.com atomic::is_always_lock_free reference网站声明如下:

Equals true if this atomic type is always lock-free and false if it is never or sometimes lock-free.The value of this constant is consistent with both the macro ATOMIC_xxx_LOCK_FREE, where defined, with the member function is_lock_free and non-member function std::atomic_is_lock_free.


对我来说,第一个奇怪的事情是“有时无锁”。它取决于什么?不过后面的问题,回到问题上来。
我做了一个小测试。写了这段代码:
#include <iostream>
#include <atomic>

int main()
{
std::atomic<bool> dummy {};
std::cout << std::boolalpha
<< "ATOMIC_BOOL_LOCK_FREE --> " << ATOMIC_BOOL_LOCK_FREE << std::endl
<< "dummy.is_lock_free() --> " << dummy.is_lock_free() << std::endl
<< "std::atomic_is_lock_free(&dummy) --> " << std::atomic_is_lock_free(&dummy) << std::endl
<< "std::atomic<bool>::is_always_lock_free --> " << std::atomic<bool>::is_always_lock_free << std::endl;
return 0;
}
使用 g++ -std=c++17 atomic_test.cpp && ./a.out 在树莓上编译并运行它(g++ 7.3.0 和 8.3.0,但这应该无关紧要)并得到:
ATOMIC_BOOL_LOCK_FREE --> 1
dummy.is_lock_free() --> true
std::atomic_is_lock_free(&dummy) --> true
std::atomic<bool>::is_always_lock_free --> false
正如您所看到的,它不像 cppreference 站点上所说的那样一致......为了进行比较,我在我的笔记本电脑(Ubuntu 18.04.5)上使用 g++ 7.5.0 运行它并得到:
ATOMIC_BOOL_LOCK_FREE --> 2
dummy.is_lock_free() --> true
std::atomic_is_lock_free(&dummy) --> true
std::atomic<bool>::is_always_lock_free --> true
所以 ATOMIC_BOOL_LOCK_FREE是有区别的的值(value),当然还有 is_always_lock_free持续的。寻找 ATOMIC_BOOL_LOCK_FREE 的定义我能找到的就是
c++/8/bits/atomic_lockfree_defines.h: #define ATOMIC_BOOL_LOCK_FREE  __GCC_ATOMIC_BOOL_LOCK_FREE
c++/8/atomic: static constexpr bool is_always_lock_free = ATOMIC_BOOL_LOCK_FREE == 2;
ATOMIC_BOOL_LOCK_FREE有什么区别(或 __GCC_ATOMIC_BOOL_LOCK_FREE )等于 1 或 2?如果 1 那么它可能是或可能不是无锁的,如果 2 是 100% 无锁的,是否是这样?除了0还有其他值吗?这是 cppreference 站点上声明所有这些返回值应该一致的错误吗?树莓派输出的哪些结果是真的?

最佳答案

ATOMIC_xxx_LOCK_FREE 宏是指:

  • 0​对于从不无锁的内置原子类型
  • 1对于有时无锁的内置原子类型
  • 2对于始终无锁的内置原子类型。

  • 因此,在您的 PI 环境中, std::atomic<bool>有时是无锁的, dummy您正在测试的实例是无锁的 - 这意味着所有实例都是。 bool std::atomic_is_lock_free( const std::atomic<T>* obj ) :

    In any given program execution, the result of the lock-free query is the same for all pointers of the same type.


    唯一的缺点是,在运行程序之前,您不知道该类型是否是无锁的。
    If(not std::atomic_is_lock_free(&dummy)) {
    std::cout << "Sorry, the program will be slower than expected\n";
    }

    关于c++ - ARM 上的 std::atomic<bool> 无锁不一致(树莓派 3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64242067/

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