首页 > 解决方案 > 标准::原子ARM(树莓派 3)上的无锁不一致

问题描述

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

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 参考站点上声明:

如果此原子类型始终是无锁的,则等于 true;如果它从不或有时无锁,则等于 false。该常量的值与宏 ATOMIC_xxx_LOCK_FREE 一致,其中定义了成员函数 is_lock_free 和非成员函数 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's 的值和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 站点上的一个错误,其中声明所有这些返回值都应该是一致的?树莓派输出的哪个结果是真的?

标签: c++gccraspberry-piarmstdatomic

解决方案



推荐阅读