atomic 相关问题

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

如果底层指针过期,std::atomic<std::weak_ptr<>>::compare_exchange_* 是否能保证正常工作?

我有一段代码,其中 std::atomic> 如果底层弱指针过期,其行为不会像我预期的那样: std::原子 我有一段代码,如果底层弱指针过期,std::atomic<std::weak_ptr<T>>的行为不会像我预期的那样: std::atomic<std::weak_ptr<Widget>> ptrAtomicWidget = ...; std::shared_ptr<Widget> ptrWidget = ptrAtomicWidget.load().lock(); while (ptrWidget == nullptr) { ptrWidget = std::make_shared<Widget>(); std::weak_ptr<Widget> ptrExpected; // <--- nullptr std::weak_ptr<Widget> ptrDesired = ptrWidget; // Problem Version: Causes an infinite loop when ptrExpected is expired if (!ptrAtomicWidget.compare_exchange_weak(ptrExpected, ptrDesired)) { ptrWidget = ptrExpected().lock(); } // Potential Repair Version: *seems* to work (could alternately move declaration of ptrExpected above while loop) if (!ptrAtomicWidget.compare_exchange_weak(ptrExpected, ptrDesired) && ptrExpected.expired() && !ptrAtomicWidget.compare_exchange_weak(ptrExpected, ptrDesired)) { ptrWidget = ptrExpected().lock(); } } 我遇到的问题涉及循环体“潜在修复版本”的“似乎有效”部分。修复需要两个不同的过期的weak_ptr在compare_exchange期间可靠地相互比较相等。 std::weak_ptr 没有相等运算符,因此其文档对此保持沉默。我能找到的关于 std::atomic<> 专业化的文档(例如 CPPReference)都没有描述指针过期时比较交换的行为。我不知道它是否恰好适用于我的特定编译器,或者 C++ 标准是否保证它。有人知道它是否能保证按标准工作吗? 您误解了弱指针 compare_exchange 何时成功的条件。 根据atomic<weak_ptr<T>>::compare_exchange_weak的规范: 效果:如果p等价于expected,则将desired分配给p,并且具有与success的值对应的同步语义,否则将p分配给expected并且具有同步语义对应于failure的值。 当两个指针等价时很重要,这也有解释: 备注:如果两个 weak_ptr 对象存储相同的指针值并且共享所有权或均为空,则它们是等效的。 弱形式可能会虚假失败。 请参阅[原子.类型.操作]。 初始化为 ptrExpected 的 nullptr 不存储与 ptrAtomicWidget 相同的指针值,因此第一次尝试比较交换总是会失败。 第二个“解决方法循环”“有效”,因为当第一次比较交换不可避免地失败时,ptrAtomicWidget的当前值被加载到ptrExpected中,这使得ptrDesired可以在第二次尝试时替换它。 对我来说,似乎 && ptrExpected.expired() 可以被删除,因为只有在 ptrWidget == nullptr 时你才会进入循环,这意味着 ptrAtomicWidget 为空或过期。

回答 1 投票 0

CAS'ing C++ 中 64 位字的 32 个低位

我有一个64位共享变量,一个线程想要CAS该字的低32位,同时忽略该字的高32位的变化。有没有一种便携的方式来实现无锁? 有吗...

回答 1 投票 0

std::atomic::wait可以用来代替互斥体吗?

在阅读了问题 C++20 mutex withatomic wait 以及 Can std::atomic 有时可以代替 std::mutex in C++? 后,我产生了这个疑问。虽然相似,但我的疑问不同,我会

回答 1 投票 0

std::atomic 变量与非原子变量的性能如何?

我很好奇在应用程序中使用 std::atomic 与普通浮点数的性能。我也很好奇是什么影响了这个。我经常看到关于原子性能的话题...

回答 1 投票 0

从文件读取到包含原子变量的结构

我有一个共享内存映射文件,它以某种类型的有效负载开头: 结构头 { 无符号长长版本 = 0; std::atomic ok = false; // 其他字段 }; 据我所知

回答 1 投票 0

C++多线程情况下向量的一个奇怪的事情<atomic<bool>>

>,代码在这里: #包括 #包括 #包括 #包括 使用命名空间 std; 国际马...

回答 1 投票 0

减少数组字段的子文档中的字段,如果 MongoDB 中不存在则添加该字段

我有一个 MongoDb 文档集合,其结构如下: { _id:“9f854842-7475-4714-1234-7ac72beef0d9”, 名称:“销售演示”, 每月配额:43, 用户用途:...

回答 1 投票 0

没有真正理解std::atomic::compare_exchange_weak和compare_exchange_strong的逻辑

我已阅读https://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange 以原子方式比较对象表示(直到 C++20)值 *this 与 expec... 的表示 (C++20 起)

回答 2 投票 0

对于编写正则表达式模式、原子组的初学者[重复]

我理解原子组不会回溯这一事实,我正在尝试示例来更多地理解这个主题,但我对其行为感到困惑,我希望有人可以解释它...

回答 1 投票 0

是否存在 std::atomic<T> 应该标记为 volatile 的情况?

在什么情况下您希望将 std::atomic 或 std::atomic_flag 标记为易失性(如果有的话)? 中断处理程序中使用的 std::atomic_flag 怎么样?是否...

回答 1 投票 0

Mongodb 中的动态原子更改,避免竞争条件

我们有这些对象,我们希望保留用户定义的顺序。例如: 班级书籍: id: 对象 ID 顺序:整数 班级俱乐部图书排名: 书籍:列表[书籍] 在提出建议之前,请先...

回答 1 投票 0

条件变量死锁示例

我陷入了僵局,无法用下面的代码解释。由于虚假唤醒,我预计代码应该可以工作,但我认为我遗漏了一些东西。我检查了这个条件变量

回答 1 投票 0

这是`std::atomic<T*>`的有效用法吗

#包括 #包括 #包括 #包括 结构节点{ 整数值; std::atomic 接下来; }; int main(){ std::原子<...

回答 1 投票 0

将 std::condition_variable 与自定义(自旋)互斥体一起使用?

我在使用 std::condition_variable 和自定义自旋互斥体实现时遇到困难。看来 std::condition_variable 期望 std::mutex 与其锁相关联,导致......

回答 1 投票 0

由于一个线程在线程启动时加载值而导致的 C++ 并发错误的最小示例

在“C++ 中的实时自白”演讲的 6:44 处,演讲者展示了有缺陷的代码,这些代码本质上可以归结为: 线程 A 写入一个名为 x 的非同步整数 很久以后,线程 B

回答 1 投票 0

这是对computeIfAbsent在这段代码中所做的事情的正确解释吗?

我正在阅读别人使用computeIfAbsent的代码。我不经常使用 lambda,并且在尝试了解它的用途时要保持谨慎。根据我自己的理解重写这个,是......

回答 2 投票 0

Java 中 iinc 是原子的吗?

我知道在没有锁定的情况下,C++ 中的增量操作不是原子的。 JVM 会在 iinc 指令的实现上加锁吗?

回答 6 投票 0

`std::memory_order`是编译器在编译时的特殊标签吗?

传递给原子操作的 std::memory_order 类型的参数会影响编译时和运行时。不过,我想知道这个类型是否是编译器的特殊标记。换句话说,当给予...

回答 1 投票 0

为什么将 memory_order 作为 std::atomic 函数的运行时参数给出

std::atomic 函数(例如 store 和 load)采用 std::memory_order 参数。该参数可以在运行时确定,就像任何其他函数参数一样。然而,实际值可能会影响

回答 3 投票 0

保证原子性的单比特操作

有没有办法在 C++ 中将单个位设置、清除、测试和翻转作为原子操作?例如“compare_and_swap”的按位变体。

回答 3 投票 0

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