atomic 相关问题

原子操作是不可分割的。该术语用于描述数据库中的事务,多线程程序中的低级访问以及文件系统操作等。

在这种*非常*特定的情况下执行原子读取的最快方法?

背景 事实证明,所有(?)编译器都将 std::atomic::load(std::memory_order_relaxed) 视为易失性负载(通过 __iso_volatile_load64 等)。 他们根本不优化或重新排序。甚至

回答 1 投票 0

并行循环调用的函数中的 OpenMP 锁定指令

我有一个在并行 for 循环中调用的函数。除了需要锁定的一个变量增量之外,该函数中的所有内容都可以并行完成。我试着把#pragma ...

回答 1 投票 0

如何在调度块中使用std::atomic<bool>?

以下代码中存在 Call toimplicitly-deleted copy constructor of 'std::atomic' 错误,std::mutex 也是同样的情况。 我只能使用串行队列来进行同步吗? __block std::atomi...

回答 1 投票 0

std::mutex 是否强制缓存一致性?

我有一个非原子变量 my_var 和一个 std::mutex my_mut。我假设到目前为止,程序员已经遵循了以下规则: 每次程序员修改或写入 my_var 时,他

回答 2 投票 0

std::mutex 是否强制缓存内聚?

我有一个非原子变量 my_var 和一个 std::mutex my_mut。我假设到目前为止,程序员已经遵循了以下规则: 每次程序员修改或写入 my_var 时,他

回答 2 投票 0

如何原子地设置redis列表值?

我想以原子方式设置列表的所有值,就像常规的 SET 命令一样。 我需要它,因为该列表是数据库查询的缓存表示。我想访问...

回答 1 投票 0

如何将 std::atomics 数组初始化为零?

std::数组< std::atomic_size_t, 10 >A; // ... std::atomic_init(A, {0}); // 错误 A = {ATOMIC_VAR_INIT(0)}; // 错误 如何将 std::atomic 数组初始化为 0? 即使 for 循环...

回答 3 投票 0

VC11 中 std::shared_ptr 上的atomic_load/atomic_store - 为什么需要全局自旋锁?

我试图准确理解如何使用原子操作安全地管理共享指针。事实证明 VC11 (Visual studio 2012) 支持 C++11,因此可以允许在 s 上进行读/写竞争...

回答 2 投票 0

为什么 std::atomic_compare_exchange 会更新预期值?

为什么std::atomic_compare_exchange及其所有兄弟姐妹都会更新传递的期望值? 我想知道除了循环中给定的简单性之外是否还有任何原因,例如:是否有...

回答 3 投票 0

确保 Linux ext4 文件系统上文件写入的完整性

我们的(嵌入式)Linux 系统有一个 ext4 文件系统。现在,我们的应用程序之一需要使用简单的文件写入 API 来修改数据文件。那里的要求是文件更新应该是...

回答 1 投票 0

将非易失性变量的地址传递给易失性对象指针

假设我有以下功能: voidatomic_add(易失性无符号 * loc, 无符号 incr ); 我想将一个变量传递给这个函数的第一个参数。 未签名的a; 原子添加(&...

回答 1 投票 0

指向易失性变量和非易失性变量的易失性指针的区别

假设我有以下功能: voidatomic_add(易失性无符号 * loc, 无符号 incr ); 我想将一个变量传递给这个函数的第一个参数。 未签名的a; 原子添加(&...

回答 1 投票 0

CUDA 和 MSVC 的编译错误:来自 <atomic> 未定义的标识符

我正在开发一个使用 cl 作为主机编译器的 CUDA 项目(Visual Studio 2019,MSVC v14.29.30133)。我遇到了与 CUDA 标准库中的 C++11 标头相关的错误

回答 1 投票 0

arm gcc:没有易失性的商店排序?

我尝试使用共享索引来指示数据已写入共享循环缓冲区。有没有一种有效的方法可以在 ARM 上执行此操作(arm gcc 9.3.1 for cortex M4 with -O3)而不使用...

回答 1 投票 0

arm gcc:没有易失性的获取-释放?

我尝试使用共享索引来指示数据已写入共享循环缓冲区。有没有一种有效的方法可以在 ARM(arm gcc 9.3.1 with -O3)上执行此操作,而不使用 discoura...

回答 1 投票 0

atomic_init 在 C 中不是线程安全的,那它为什么存在呢?

C17 标准第 7.17.2.2 节规定了以下关于 中定义的 voidatomic_init(volatile A *obj, C value) 的内容: 虽然这个函数初始化了一个原子对象,但它确实...

回答 1 投票 0

混合有/无条件的内存顺序

请考虑以下事项: std::atomic_bool 已禁用; int 计数器1、计数器2; [主题 1] 计数器2 = ...; if (disabled.load(std::memory_order::acquire) && counter2 > counter1) //#1 {

回答 1 投票 0

通过对象隔离实现原子性

我面临着一个我不知道如何有效解决的问题,该问题涉及大量使用 DBMS。我有一个长时间运行的过程刷新(通过批量插入/删除/更新)许多表。这样的

回答 1 投票 0

C11中_Atomic的“临界区”是什么

根据此 cppreference 页,对于 _Atomic int a、++a/a++/a %= 2/etc 都是原子的。但问题是,会出现以下表达式: _原子大小_t thread_counter = 0; 无效线程计数(){ 整数

回答 1 投票 0

结构位域上的 std::atomic

我正在修改一些现有的开源库,并且有一个包含位字段的结构(例如名为 Node),例如 结构节点{ std::atomic 大小:30; std::原子 我正在修改一些现有的开源库,并且有一个包含位字段的结构(例如名为 Node),例如 struct Node { std::atomic<uint32_t> size:30; std::atomic<uint32_t> isnull:1; }; 为了满足我的需求,这些字段需要是原子的,所以我希望为此使用 std::atomic 并面临编译时错误: bit-field 'size' has non-integral type 'std::atomic<uint32_t>' 根据文档,有一组受限制的类型可用于 std::atomic 任何人都可以建议/了解如何在对现有源代码影响最小的情况下获得原子字段的功能吗? 提前致谢! (1) 您可以使用 这个示例 通过#defining 位来操作原子整数的位。 (2) 使用需要原子性的位域在编程上不太理想,但您可以牺牲 8 位并使用并集在位域中插入 std::atomic_flag(锁)。 每次访问该结构时都可以手动旋转锁定。但是,代码的性能应该比使用 std::mutex 和 std::unique_lock 创建、锁定、解锁、销毁更好。此代码可能会浪费大约 10-30 个时钟周期来启用低成本多线程。 PS。确保下面保留的 8 位不会被处理器的字节序结构弄乱。您可能必须在末尾定义大端处理器。我只在 Intel CPU 上测试了这段代码(始终是小端)。 // Use when the operation is quick to avoid mutex locks, // but too long to fit into a single atomic operation, #include <iostream> #include <atomic> #include <thread> union Data { std::atomic_flag access = ATOMIC_FLAG_INIT; // one byte struct { typedef unsigned short ushort; ushort reserved : 8; ushort count : 5; ushort ready : 1; ushort mult : 2; } bits; }; class SpinLock { public: inline SpinLock(std::atomic_flag &access, bool locked=true) : mAccess(access) { if(locked) lock(); } inline ~SpinLock() { unlock(); } inline void lock() { while (mAccess.test_and_set(std::memory_order_acquire)) { } } // each attempt will take about 10-30 clock cycles inline bool try_lock(unsigned int attempts=0) { while(mAccess.test_and_set(std::memory_order_acquire)) { if (! attempts) return false; -- attempts; } return true; } inline void unlock() { mAccess.clear(std::memory_order_release); } private: std::atomic_flag &mAccess; }; void aFn(int &i, Data &d) { SpinLock lock(d.access, false); // ... some code... // manually locking/unlocking can be tighter lock.lock(); if (d.bits.ready) { ++d.bits.count; } d.bits.ready ^= true; // alternate each time lock.unlock(); // ... some other code... } void aFn2(int &i, Data &d) { // When you need to lock the entire function SpinLock lock(d.access); if (d.bits.ready) { d.bits.count += d.bits.mult; } d.bits.ready ^= true; ++ d.bits.mult; } // returning will free up the lock as well int main(void) { Data f; f.bits.count = 0; f.bits.ready = true; f.bits.mult = 1; std::thread *p[8]; for (int i = 0; i < 8; ++ i) { p[i] = new std::thread([&f] (int i) { aFn(i, f); }, i); } for (int i = 0; i < 8; ++i) { p[i]->join(); delete p[i]; } std::cout << "size: " << sizeof(f) << std::endl; std::cout << "count: " << f.bits.count << std::endl; } 结果正如预期的那样... 尺寸:2 数量:4

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.