atomic 相关问题

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

C++ 内存模型

我一直在探索 C++ 的世界,我对以下问题很感兴趣。我对正式答案感兴趣(带有指向 C++ 标准的链接以确认您的答案)。我希望你会是

回答 0 投票 0

这个 compare_exchange_weak 示例循环在原子布尔值上做了什么,来自关于弱和强之间区别的讨论?

这里引用了本次 CppCon 讲座中 37:00 的幻灯片:https://youtu.be/DS2m7T6NKZQ 主持人在讲compare_exchange_swap_strong和

回答 1 投票 0

睡眠时间非常短,为什么线程在看到停止标志设置之前只完成零次或一次打印迭代?

见下面的代码,AsyncTask 创建一个对等线程(计时器)来增加一个原子变量并休眠一段时间。预期的输出是打印 counter_ 10 次,值范围从 1 到 10,...

回答 1 投票 0

关于递增原子变量的问题?

见下面的代码,AsyncTask 创建一个对等线程(计时器)来增加一个原子变量并休眠一段时间。预期的输出是打印 counter_ 10 次,值范围从 1 到 10,...

回答 1 投票 0

共享内存原子编译 sm_20 但不是 sm_13

我正在使用具有 1.3 计算能力和 nvcc 编译器驱动程序 4.0 的 Tesla C1060。我正在尝试对线程块进行一些本地计算。每个线程块都有一个共享数组,它是

回答 1 投票 0

共享内存中的加载和存储操作是原子的吗?

当我们从 CUDA 中的共享内存加载/存储时,我试图弄清楚原始类型的加载和存储操作是否是原子的。 一方面,似乎任何加载/存储都被编译为...

回答 1 投票 0

与 CUDA 共享内存互斥 - 添加到项目列表

我的问题如下:我有一张图像,其中我使用 GPU 检测了一些兴趣点。检测在处理方面是一个重量级的测试,但是只有大约25分之一的p ...

回答 2 投票 0

如何在 firebase 实时数据库中进行批量写入 [重复]

我正在制作一个社交媒体应用程序,我需要能够同时进行多个设置、更新和删除。他们需要要么全部成功,要么全部失败。 我知道在 firestore 你可以做一个 ba...

回答 0 投票 0

GCC 32 位 arm 内联汇编约束,用于原子加载/存储寄存器对 [重复]

在 32 位 ARM 汇编中有几条指令可用于原子加载和存储一对寄存器: ldaexd 和 stlexd(用于具有获取-释放内存顺序的 ARMv8 32 位)[https://

回答 1 投票 0

在另一个之前自动耗尽一个 mpsc

我在一个线程中有两个 std::sync::mpsc 接收器,一个优先接收器和一个常规接收器。有什么方法可以原子地确保在使用常规队列之前排空优先级队列?我...

回答 1 投票 0

Rust:在另一个 mpsc 之前自动耗尽一个 mpsc

我在一个线程中有两个 std::sync::mpsc 接收器,一个优先接收器和一个常规接收器。有什么方法可以原子地确保在使用常规队列之前排空优先级队列?我...

回答 0 投票 0

在 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

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