问题标签 [stdatomic]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
535 浏览

c++ - C11/C++11 弱内存基准测试

任何人都可以指出使用宽松原子操作(特别是memory_order_releaseand memory_order_acquire,而且memory_order_consumeand memory_order_relaxed)与默认值比较 C11/C++11 代码的性能的基准测试结果memory_order_seq_cst吗?所有架构都很有趣。提前致谢。

0 投票
2 回答
283 浏览

c++ - 什么时候不应该使用 [[carries_dependency]]?

我发现了一些问题(比如这个),问什么[[carries_dependency]]是,这不是我在这里要问的。

我想知道你什么时候不应该使用它,因为我读过的所有答案都让人觉得你可以在任何地方粘贴这段代码,并且神奇地你会得到相同或更快的代码。一条评论说代码可以相同或更慢,但张贴者没有详细说明。

我想使用 this 的适当位置是在作为指针或引用的任何函数返回或参数上,并且将在调用线程中传递或返回,并且不应在回调或线程入口点上使用它。

有人可以评论我的理解并详细说明该主题,何时以及何时不使用它?

编辑:我知道这个主题有这本书,如果任何其他读者感兴趣的话;它可能包含我的答案,但我还没有机会阅读它。

0 投票
2 回答
965 浏览

c++ - 如何使用c++11原子库实现seqlock锁

我想使用 c++11 原子库编写一个 seqlock。我在stackoverflow上阅读了一些关于seqlock的问题,但没有人帮助我。我使用的算法很常见,到处都能找到。这是我的代码:

我确保在 B 和 C 处正确使用 memory_order 标签。

我认为A和D不正确。

想想我们同时读取和写入保护数据。我担心D处flags的读取值太旧,我们没有读取write_lock()写入的最新值。但是我们读取了保护数据的最新值由写线程编写(在x86系统上可能不会发生,但我不认为代码在x86上运行。)。在读线程完成读取受保护的数据后,由于标志的读取值太旧,我没有'没有发现序列已经增加。从循环中读取线程产生,我们犯了一个错误。

(1)处受保护数据的读取值在(4)处写入,(2)处flags的读取值在(3)处不写入(它是我们上次解锁写锁时写入的。)。即为什么我认为有一个错误。

但我真的不知道如何解决这个问题。我试图在 read_leavee() 和 write_locke() 之间建立“同步”关系(我希望“read_leave() 与 write_locke() 同步”)。但是没有存储read_leave() 中的操作,所以我失败了。

(哦!c++ 标准规范对我来说太难理解了。部分原因是我不是来自英语国家。)

0 投票
4 回答
404 浏览

c++ - 原子.load() 与 std::memory_order_release

在编写使用新引入的线程同步原语以利用宽松的内存排序的 C++11 代码时,您通常会看到

或者

我很清楚为什么这是有道理的。

我的问题是:这些组合是否vv.store(42, std::memory_order_acquire)vv.load(std::memory_order_release)有意义?在什么情况下可以使用它们?这些组合的语义是什么?

0 投票
2 回答
741 浏览

c++ - 正确使用 std::atomic

这是使用 std::atomic 的正确方法吗?我Logger在命名空间级别声明了一个名为LOGGER

我的期望是LOGGER实例化一次(没有竞争;它将从代码中的单个已知点初始化),然后从多个线程访问。

我是 C++ 中的多线程和线程安全的新手;但在 C# 或 Java 中,我想要么制作LOGGER volatile ,要么(在 C# 中)在它周围放置内存栅栏。这是 C++ 中的正确类比吗?

0 投票
1 回答
2177 浏览

multithreading - 使用 std::atomic 在 C++11 中编写线程安全的双端队列

我需要一个同时读取/写入的消息双端队列。只写就够了吗

这对于具有 astd::deque<Message> queue_和 astd::mutex mutex_作为数据成员并mutex_在将任何操作转发到之前锁定的包装类是否相同queue_

0 投票
2 回答
1416 浏览

c++ - std::atomic 可以安全地与 OpenMP 一起使用吗

我目前正在尝试学习如何使用 OpenMP,但我有一个问题。这样做是否安全:

或者我应该使用:

谢谢 !

编辑:我知道最简单的处理方法是使用数组,但我问是因为我很好奇

0 投票
4 回答
2594 浏览

c++ - 在没有互斥体的 C++11 中实现共享整数计数器的最简单方法:

假设我们有以下代码来计算某事发生的次数:

就目前而言,i 上有一个明确的竞争条件。使用 C++11,(1) 消除这种竞争条件的最简单方法是什么,以及 (2) 最快的方法是什么?最好不使用互斥锁。谢谢。

更新:使用注释来使用原子,我得到了一个在英特尔编译器版本 13 下编译的工作程序:

0 投票
1 回答
187 浏览

c++ - 原子 RMW 操作和函数调用的比较成本是多少?

我的理解是原子机器指令可能比非原子操作慢两个数量级。例如,给定

我的理解是,它x++的运行速度通常比y++. (我假设增量操作映射到底层机器指令。我确信确切的比较成本因架构而异,但我说的是经验法则。)

作为一般经验法则,我对原子 RMW 操作和非内联函数调用的相对成本感兴趣。例如,给定这个非内联函数,

与执行非内联调用的成本相比,我们通常可以说什么y++(即原子增量)的成本f

我的动机是试图正确看待“原子操作比非原子操作昂贵得多”这一普遍说法。一种方法是尝试了解原子 RMW 操作与调用和从非内联函数返回相比有多昂贵。

请不要回答“唯一知道的方法就是测量”。我不是在询问原子 RMW 操作与特定架构上特定上下文中的函数调用。我问的是一个通用的经验法则,可以用作讨论的基础,供那些可能认为“我们永远不能使用原子指令,因为它们太贵”的人讨论,但谁不会三思而后行函数调用。

0 投票
0 回答
382 浏览

multithreading - 在没有任何内存排序限制的情况下访问 C++11 std atomic

各种无锁算法在快速路径中没有加载或存储排序要求。例如,在这个工作窃取http://www.cs.rice.edu/~vs3/PDF/ppopp.09/p45-michael.pdf中,窃取操作需要原子比较和交换,但频繁的操作(put and take) 专门设计为不需要任何排序约束。在许多其他情况下,我遇到过这种模式。

那么为什么在不强制内存限制的情况下就无法访问 std 原子变量呢?虽然在 x-86(-64) 上 memory_order_relaxed 不会插入任何 CPU 屏障指令,但它会阻止编译器重新排序(至少从我在 Visual C++ 2012 实现中看到的内容来看),这仍然肯定会产生负面性能。事实上,由于内存顺序是一个运行时参数,因此也会产生分支的惩罚。结合起来,这使事情变得更糟。下面是 Visual C++ 2012 实现中的代码,它在 switch 语句确定它是 memory_order_relaxed 之后将 uint32_t 值存储到 atomic_uint32_t 中(参见 xatomic.h):

带有 memory_order_relaxed 的加载然后最终执行

更糟糕的是,_InterlockedOr 内在函数是一个完整的 CPU 屏障 (xatomic.h)。

那么,1)为什么非内存有序访问不是 std API 的一部分,以及 2)除了滚动自己的原子 API 之外,除了将原子类丑陋的 reinterpret_cast 转换为非原子类型和对 sizeof 和 offsetof 进行一些编译时检查?

(请注意,我不是在谈论混合原子访问和非原子访问,因为我关心的是整数类型,其正常加载和存储在我的目标架构上已经是原子的。)