互锁变量访问(在布尔值上)和 std::atomic_flag 之间的区别
Difference between interlocked variable access (on boolean) and std::atomic_flag
我想知道使用 Windows 的interlockedXXX
函数访问布尔值和使用std::atomic_flag
有什么区别。
据我所知,它们都是无锁的,您无法直接设置或读取atomic_flag
。我想知道是否还有更多差异。
std::atomic_flag
基本上用作构建其他同步原语的原语。如果需要设置或阅读,与std::atomic<bool>
进行比较可能更有意义。
但是,还有一些额外的(概念(差异:
-
使用
interlockedXXX
,您将无法获得可移植代码。 -
interlockedXXX
是一个函数,而std::atomic_flag
(以及std::atomic
(是一个类型。这是一个显着的区别,因为您可以将interlockedXXX
与任何合适的内存位置一起使用,例如std::vector
元素 .相反,您不能创建C++原子标志或原子布尔值的向量,因为相应的类型不符合向量值类型要求。1
您可以在 @RmMm 创建的代码中看到后一种差异,其中flag
是一个普通变量。我还添加了一个带有atomic<bool>
的情况,您可能会注意到所有三个变体都产生完全相同的组件:
https://godbolt.org/z/9xwRV6
[1] 这个问题应该在C++20std::atomic_ref
中得到解决。
相关文章:
- 如何从 std::atomic 中提取指针 T<T>?
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- std::memory_order for std::atomic:<T>:wait
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- 在 lambda 表达式中使用 std::atomic
- C++std::atomic在程序员级别保证了什么
- 如果在 2 个线程中使用,是否值得将size_t声明为 std::atomic?
- MyType 允许 std::atomic 的确切要求是什么<MyType>?
- 无法将类型"T&"的非常量左值引用绑定到类型"T"的右值 t++ std::atomic<T>
- 在 C++20 之前和之后初始化 std::atomic
- std::atomic 和 std::mutex 的相对性能
- 使用用户定义的类型 UDT 实例化 std::atomic<>。如果 UDT 具有虚函数,则 l 墨水将失败。为什么?
- 简单使用 std::atomic 在两个线程之间共享数据
- Port pthread_cond_broadcast to std::atomic
- std::atomic中的任何内容都是免费等待的
- 对于 CPU 无法原子操作的类型,std::atomic 有什么意义?
- 最接近"std::atomic<std::vector>"是什么?
- 为什么 std::atomic<std::string> 会给出微不足道的可复制错误?
- std::atomic<std::chrono::high_resolution_clock::time_point> 无法编译
- std::atomic<std::string> 是否正常工作?