c++ - 标准::原子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 站点上的一个错误,其中声明所有这些返回值都应该是一致的?树莓派输出的哪个结果是真的?
解决方案
推荐阅读
- asp.net - 在发布时更改 .config 文件中的 appender 参数值(天蓝色管道)
- python - 在 PYTHONSTARTUP 中设置的 .pythonstartup 文件中打开 Python 解释器时如何读取当前目录?
- ios - ionic 4中的iOS推送通知没有声音
- android - 在颤振上动态添加choicechip
- java - FileUtils.copyFile() 在尝试复制 exe 时使程序崩溃
- php - laravel swagger 无法与 App 目录之外的控制器一起使用
- kotlin - 如何在 Kotlin 中反映可为空的字段
- node.js - 如何从 greenlock-express 获取证书文件以用于 Nginx?
- php - 如何在使用 php 上传之前裁剪图像?
- python - 在 Django 过滤方法中使用列字段