问题标签 [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.
c++ - 当类型不是 Integral 时,如何使用 std::atomic 执行基本操作?
准确地说,我只需要将一个 double 再增加一个 double 并希望它是线程安全的。我不想为此使用互斥锁,因为执行速度会大大降低。
c++ - std::atomic 变量应该使用“正常”语法还是“加载”和“存储”?
如果我有一个原子变量,例如,
我想对其执行读写操作,我可以使用“正常”语法,例如,
我还可以使用显式load
和store
成员函数:
我见过像 Andrei Alexandrescu 和 Anthony Williams 这样的人建议只使用显式load
和store
形式,大概是因为“正常”形式并不强调变量是原子的。这似乎几乎是匈牙利符号的一种形式。读写原子时使用的语法是否有新的约定?
c++ - 原子存储抛出错误
我最近升级到了兼容 C++11 的编译器,我试图将一些代码从 boost 更新到 c++11 标准。使用 atomic_store over 转换一些代码时遇到了问题。这是一些简单的测试代码,似乎给我抛出了编译器错误。
该std::atomic_store(&m,std::move(a));
行为我引发了编译器错误:
从 boost 迁移到 C++11 时 atomic_store 的方式是否发生了变化?我现在需要创建共享指针的原子对象吗?
c++ - 在 C++11 中安全且明确地操作原子变量
我必须从多播 (UDP) 流中读取一些数据(以惊人的速度 - 每秒最多 5000 条消息)。因为流是多播的(并且数据非常关键),数据提供者提供了两个发送相同数据的流(它们的逻辑是相同数据包在两个流中丢失的可能性非常接近于零)。所有数据包都标有序列号以进行跟踪。
此外,该应用程序对时间非常关键,以至于我不得不并行收听两个流并从它首先收到的任何多播流中获取下一个序列号 - 当相同的数据包出现在镜像流上时,我只是将其丢弃.
我计划在两个函数之间使用一个通用的“sequence_number”变量来实现这个drop特性——顺便说一下,这两个函数在不同的线程中运行。序列号是atomic
因为它将从两个不同的线程中读取和更新。
想到的明显算法是
(上述算法需要在序列号乱序时进行修改——它们可以作为 UDP 流——但暂时忘记它)
我的问题是这样的:
从std::load
我开始sequence_number
,检查它是否小于我从流中接收到的序列号,接受数据包,最后 std::store
将新的序列号改为sequence_number
;如果另一个流接收到相同的数据包(具有相同的序列号)并执行相同的操作(在第一个流完成std::store
该序列号之前),我基本上会在我的系统中两次收到相同的数据包。有什么办法可以克服这种情况?
c++ - 铿锵不支持std :: atomic?
我正在尝试将 std::atomic 与 clang 一起使用。但是,每当我尝试包含头文件 atomic ( #include <atomic>
) 时,都会收到消息“找不到 atomic”。请注意,我std=c++11 -stdlib=libc++
在编译时包括 - 。我错过了什么?
我使用的 clang 版本是 3.2。
c++ - C++ 11 未定义对 `__atomic_store_16' 的引用
以下代码无法链接:
出现以下错误:
如果我将 unsigned long-s 替换为大小不超过 int 的任何内容,则编译得很好。使用 g++ 4.7.2 。你知道这是为什么吗?
用命令编译:
c++ - atomic_thread_fence(memory_order_seq_cst) 是否具有完整内存屏障的语义?
完整/通用内存屏障是指在屏障之前指定的所有 LOAD 和 STORE 操作相对于系统的其他组件似乎都发生在屏障之后指定的所有 LOAD 和 STORE 操作之前。
根据cppreference,memory_order_seq_cst
等于memory_order_acq_rel
加上对所有如此标记的操作的单个总修改顺序。但据我所知,C++11 中的获取和释放栅栏都不强制执行#StoreLoad(存储后加载)排序。释放栅栏要求之前的读/写不能与任何后续写入重新排序;获取栅栏要求不能对任何先前的读取重新排序后续读取/写入。如果我错了,请纠正我;)
举个例子,
优化编译器是否允许将指令 (3) 重新排序到 (1) 之前,使其有效如下所示:
如果这是一个有效的转换,那么它证明atomic_thread_fence(memory_order_seq_cst)
不一定包含完整屏障所具有的语义。
c++ - 显式原子加载/存储与通常的 operator= 和 operator T 有什么区别?
考虑以下两种变体:
和
我从文档中看到第二个是完全原子的,但是我不明白什么时候应该使用哪个以及详细的区别是什么。
c++ - C++ std::原子联合
如何使用 std::atomic 将联合设置为原子的?还是我必须将工会的成员声明为原子的?
访问联合会报错:
我是否需要做类似的事情:
并声明成员变量值如下?
c - Xcode 和 C11 stdatomic.h
似乎 Xcode 5 及更高版本支持 C11,但是当我尝试包含 stdatomic.h 时,它说找不到文件?是否可以在 Xcode 中使用 C11 原子结构?