atomic 相关问题

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

在 Go 的地图中实现原子计数器的最佳方式

我想在map(map[string]int64)中实现一个原子计数器,在Go中如何实现?首先,我不能只使用 int64 作为键,因为我不能在映射中获取这个值的地址 ...

回答 3 投票 0

使用 AtomicIntegers 构造的可观察对象在 RxJava 中的意外行为

这是测试用例: 导入 io.reactivex.rxjava3.core.*; 导入 java.util.concurrent.TimeUnit; 导入 java.util.concurrent.atomic.AtomicInteger; 公共课 MainTest { 公共静态 AtomicInte ...

回答 1 投票 0

线程间简单变量的最快安全通信?

Stack Overflow 上有类似标题的问题,但它们与我要问(和不问)的问题之间存在重大差异:请参见下面的粗体。 说我有时间-

回答 0 投票 0

使用新的 atomic.Pointer 类型实现无锁无界队列

我正在尝试从 Michael 和 Scott 实现这个非阻塞队列。 我正在尝试使用 Go 1.19 中引入的新 atomic.Pointer 类型,但我的应用程序中出现了数据竞争。 我在这里...

回答 1 投票 0

eBPF 未能使用原子操作

[环境] 1.aarch-linux-5.15.7() 2.bpf编译工具:clang-11, 3.bpf编译参数: clang -g -target bpf -Wall -O2 -g3 -g -DBPF_CODE -ggdb -std=gnu99 -D__TARGET_ARCH_arm64 -Wno-compare-distinct-

回答 0 投票 0

哪种自旋锁方法更有效:重试 test_and_set(),还是在 test() 上自旋只读?

哪种自旋锁方法更好(在效率方面)? #包括 #定义方法1 诠释主要() { std::atomic_flag 锁 { }; #if 方法 == 1 while ( lock.test_and_set( std::

回答 1 投票 0

哪种自旋锁方法更有效?

哪种自旋锁方法更好(在效率方面)? #包括 #定义方法1 诠释主要() { std::atomic_flag 锁 { }; #if 方法 == 1 while ( lock.test_and_set( std::

回答 1 投票 0

原子变量的向量(数组)

我知道 atomic 有一个被删除的复制构造函数,但是我该怎么做才能使这段代码工作?我怎么可能在原子向量中定义一个复制构造函数? #包括 我知道 atomic 有一个被删除的复制构造函数,但是我该怎么做才能使这段代码工作?我怎么可能在向量中为原子定义一个复制构造函数? #include <atomic> #include <vector> int main() { std::vector<std::atomic<int>> examp; examp.resize(64); } 你不能有 std::atomic<int> 的向量,因为它不可复制或移动,但你可以有一个 unique_ptr 到 atomic<int> 的向量。如果你真的需要一个运行时可变大小的原子向量,这可能是一个可行的选择。这是一个例子: #include <iostream> #include <atomic> #include <vector> #include <memory> using namespace std; int main() { std::vector<std::unique_ptr<std::atomic<int>>> examp; examp.resize(64); // 64 default unique_ptrs; they point to nothing // init the vector with unique_ptrs that actually point to atomics for (auto& p : examp) { p = std::make_unique<std::atomic<int>>(0); // init atomic ints to 0 } // use it *examp[3] = 5; for (auto& p : examp) { cout << *p << ' '; } cout << '\n'; } std::atomic 不可复制或移动。正如您所指出的,复制构造函数被删除但没有生成移动构造函数。见http://en.cppreference.com/w/cpp/language/move_constructor: 如果没有为类类型提供用户定义的移动构造函数 (结构、类或联合),并且以下所有为真: 没有用户声明的拷贝构造函数; 用户声明的意思是“编译器没有添加”(即由default)。尽管它是一个库类,但构造函数是用户声明的。 矢量的 resize 函数要求类型是可移动插入或可复制插入的,具体取决于重载。见http://en.cppreference.com/w/cpp/container/vector/resize: 如果当前大小小于计数, 1)附加默认插入的元素 2)附加值的额外副本 你所做的根本行不通。 我在 VS 2022 中尝试了以下代码并且它有效: #include <atomic> #include <vector> int main() { std::vector<std::atomic<int>> examp (64); } 但是,由于std::atomic类型不可复制不可移动,所以一些成员函数(如resize())无法实现。对于原子变量的向量,许多成员函数提出了更严格的要求。 见https://en.cppreference.com/w/cpp/container/vector 如果你只需要一个运行时变量的大小,但之后不需要调整对象的大小,你可以使用 std::vector< atomic<int> > elems(size) 正如@Quanbing Luo 指出的那样。 像.pop_back和.push_back这样的成员函数不会编译,即使你已经安排好了它绝对不会超过它的.capacity()并且必须增长。但除此之外它应该工作正常。 在 C++20 中,您可以使用 std::atomic_ref 对普通 int 对象进行原子操作,因此您可以使用 std::vector<int> 和 static_assert(std::atomic_ref<int>::required_alignment == alignof(int), "vector elements need to be sufficiently aligned for atomic_ref"); std::vector<int> examp(size); // and potentially do whatever non-atomic init before sharing examp.resize(size2); std::atomic_ref<int> examp3(examp[3]); examp3.store(1, std::memory_order_release); 也许到处都使用typedef或其他东西而不是裸露的int。甚至可能是一些原子操作的辅助函数,因此您不必在单独的语句中手动构造 atomic_ref 对象。 (构造一个是免费的;只要您不保留 atomic_ref 对象,它就会优化。它仅作为 API 存在,用于包装像 GNU C __atomic_load_n(int *, int memorder) 这样的东西,您可以手动使用它,如果你不想使用 C++20 特性。) 当其他线程正在访问它的元素时,没有什么可以使它线程安全地增长或缩小向量,所以在另一个答案中提出的额外间接级别没有任何好处std::vector<std::unique_ptr<std::atomic<int>>> examp;。std::vector<unique_ptr>对象本身(通常 3 个指针,.data()、.end() 和分配结束)不是原子的,任何在另一个线程访问它时重新分配数组的东西都是一个问题。 编写低效代码只是为了让编译器满意,这与使用无锁原子而不是锁定(以牺牲简单性为代价的性能)的目的有点不一致。

回答 4 投票 0

为什么跨高速缓存行边界的变量原子存储编译为普通 MOV 存储指令?

让我们看一下代码 #包括 #pragma pack(推,1) typedef 结构 test_s { uint64_t a1; uint64_t a2; uint64_t a3; uint64_t a4; uint64_t a5; uint64_t a6; ...

回答 1 投票 0

原子操作有内存顺序问题吗?

原子操作之间是否存在关系,例如原子也需要内存顺序?对于代码: 静态整数零 = 0; static int proc_enter(struct proc_context* ctx, st...

回答 0 投票 0

内存控制器如何在传播缓存行时保证原子的内存顺序?

我目前正在深入研究 std::atomics 和 C++ 内存模型。真正帮助我建立思维模型的是 CPU 的存储和加载缓冲区的概念,它基本上是一个 fifo 队列...

回答 1 投票 0

有什么方法可以从文件 C++ 中自动读取一行

我目前正在做一个项目,我有一个大文本文件(15+ GB),我试图在文件的每一行上运行一个函数。为了加快任务的速度,我创建了 4 个线程和

回答 2 投票 0

用原子读/写内存实现锁的好方法是什么? (不是 RMW!)

众所周知,使用原子读/写内存(您可以原子地读或写)不可能以无等待的方式解决 >= 2 个进程的共识。我意识到...

回答 0 投票 0

C11内存栅栏和原子操作

我正在研究记忆障碍。 我对以下代码有一些疑问。 //版本 1 线程 A: *val = 1; atomic_thread_fence(memory_order_release); atomic_store_explicit(发布...

回答 1 投票 0

“AFTER UPDATE”触发“FOR EACH ROW”是原子的吗?

每当原始行被修改(更新)时,我想在“历史”表中插入一行。我想使用原始行的 ID 作为历史表的 FOREIGN KEY。但是这个ID ...

回答 0 投票 0

c++ 中的原子指针和线程间对象传递

我的问题涉及std::atomic和这个指针指向的数据。如果在线程 1 中我有 对象A; std:atomic ptr; 整数栏 = 2; A.foo = 4; //foo 是一个整数; ptr.st...

回答 2 投票 0

单个作者和多个读者的单次写入并发

NOTE:本题与其他并发题不同的是,不仅writer是单一的,而且write操作严格发生一次。 Go to 中有什么同步方法...

回答 1 投票 0

如何以原子方式检查 ArrayList 是否包含元素? [重复]

比方说,我们正在尝试将几个元素添加到 ArrayList 中。同时,在同一个列表中搜索 list.contains(givenElement)。 那么,我们如何在没有 l... 的情况下实现线程安全

回答 1 投票 0

编译器能否优化掉没有按任何内存栅栏排序的放宽内存顺序的访问?

考虑以下代码: #包括 std::atomic 标志; 无效线程 1() { flag.store(true, std::memory_order_relaxed); } 空线程 2() { while (!flag.load(std::

回答 1 投票 0

在 C/C++ 中如何确保内存写入是在读取之后?

我最近在研究 C/C++ 中的 memory_order,我已经阅读了 https://en.cppreference.com/w/cpp/atomic/memory_order , https://gcc.gnu.org/wiki/Atomic/GCCMM /AtomicSync ,但对

回答 0 投票 0

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