问题标签 [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++ - 实现原子::店铺
我正在尝试从 C++0x 草案中实现原子库。具体来说,我正在实施第 29.6/8 节,即store方法:
该要求指出:
order 参数不应是 memory_order_consume、memory_order_acquire 或 memory_order_acq_rel。
如果是其中之一,我不确定该怎么做。我应该什么都不做,抛出异常,获得未定义的行为,还是做其他事情?
PS:“C++0X”看起来有点像死鱼:3
c++ - 比较和交换 C++0x
来自关于 C++ 原子类型和操作的C++0x 提案:
29.1 顺序和一致性 [atomics.order]
添加带有以下段落的新子条款。
枚举
memory_order
指定详细的常规(非原子)内存同步顺序,如[N2334 或其采用的后续程序添加的新部分] 中定义的,并且可以提供操作顺序。其枚举值及其含义如下。
memory_order_relaxed
该操作不对内存进行排序。
memory_order_release
对受影响的内存位置执行释放操作,从而通过应用它的原子变量使常规内存写入对其他线程可见。
memory_order_acquire
对受影响的内存位置执行获取操作,从而使通过应用它的原子变量释放的其他线程中的常规内存写入对当前线程可见。
memory_order_acq_rel
该操作具有获取和释放语义。
memory_order_seq_cst
该操作具有获取和释放语义,此外,还具有顺序一致的操作顺序。
提案中较低的:
可以指定 CAS 的内存顺序。
我的理解是“<code>memory_order_acq_rel”只会同步操作所需的那些内存位置,而其他内存位置可能保持不同步(它不会充当内存围栏)。
现在,我的问题是 - 如果我选择“<code>memory_order_acq_rel”并应用于compare_swap
整数类型,例如整数,这通常如何转换为现代消费处理器(如多核 Intel i7)上的机器代码?其他常用的架构(x64、SPARC、ppc、arm)呢?
特别是(假设一个具体的编译器,比如 gcc):
- 如何使用上述操作比较和交换整数位置?
- 这样的代码会产生什么指令序列?
- i7的操作是无锁的吗?
- 这样的操作会运行完整的缓存一致性协议,同步不同处理器内核的缓存,就好像它是 i7 上的内存栅栏一样?还是只会同步此操作所需的内存位置?
acq_rel
与上一个问题相关 -在 i7 上使用语义是否有任何性能优势?其他架构呢?
感谢所有的答案。
c++ - [[carries_dependency]] 属性是什么意思?
有人能用凡人都能理解的语言来解释吗?
c++ - 对共享内存的原子访问
我在多个进程之间有一个共享内存,它以某种方式对内存进行交互。前任:
我想要的是让计数器自动更新/递增。并在该地址上发生内存释放。例如,如果我没有使用共享内存,它将类似于
我如何为随机内存位置实现这一点(解释为 DataBlock 计数器 >above)。我可以保证地址按照架构的要求对齐(x86 linux)
- 使更新原子化 - 如何?(即 atomicupdate(addr, newvalue))
- 多核的内存同步 - (即 memorysync(addr)) - 我能看到的唯一方法是使用 std::atomic_thread_fence(std::memory_order_release) - 但这将“建立所有原子和宽松原子存储的内存同步排序” - 就是这样对我来说有点矫枉过正——我只想同步计数器位置。欣赏任何想法。
c++ - c++,std::atomic,什么是 std::memory_order 以及如何使用它们?
谁能解释一下std::memory_order
简单的英语是什么,以及如何使用它们std::atomic<>
?
我在这里找到了参考资料和几个例子,但根本不明白。 http://en.cppreference.com/w/cpp/atomic/memory_order
c++ - memory_order_seq_cst 和 memory_order_acq_rel 有何不同?
存储是释放操作,加载是两者的获取操作。我知道这memory_order_seq_cst
意味着对所有操作施加额外的总排序,但我无法构建一个示例,如果所有memory_order_seq_cst
操作都替换为memory_order_acq_rel
.
我是否遗漏了什么,或者差异只是文档效果,即memory_order_seq_cst
如果一个人不打算使用更宽松的模型并memory_order_acq_rel
在约束宽松模型时使用,则应该使用?
c++ - 我可以使用 volatile sig_atomic_t 来避免 C++03 中的互斥锁吗?
如果我在具有原子读取和递增/递减支持的硬件上,我可以volatile sig_atomic_t
在 C++03 中使用 a 来访问原子操作并避免完全成熟的互斥锁,还是必须等待 C++11 和std::atomic<int>
?
c++ - 检查前提条件是否存在原子增量,即原子值小于指定值?
在新的标准 C++ 原子递增操作中,在递增值之前检查先决条件,即原子值小于指定值?
我可以比下面的代码更容易更快地完成它吗?
如果有人不知道 compare_exchange_weak 的工作原理: compare_exchange_weak 读取 val,与 old_val 进行比较,如果它们不相等,则将 val 保存到 old_val。如果相等,则将 new_val 保存到 val。
c++ - 是否有必要使用 std::atomic 来表示线程已完成执行?
我想检查 astd::thread
是否已完成执行。搜索 stackoverflow 我发现以下问题解决了这个问题。接受的答案建议让工作线程在退出之前设置一个变量并让主线程检查这个变量。这是此类解决方案的最小工作示例:
对已接受的答案发表评论的人声称,不能使用简单的bool
变量作为信号,代码在没有内存屏障的情况下被破坏并且使用std::atomic<bool>
是正确的。我最初的猜测是这是错误的,一个简单bool
的就足够了,但我想确保我没有遗漏任何东西。上面的代码是否需要astd::atomic<bool>
才能正确?
让我们假设主线程和工作线程在不同套接字的不同 CPU 上运行。我认为会发生的是,主线程thread_finished
从其 CPU 的缓存中读取。当 worker 更新它时,缓存一致性协议负责将 worker 更改写入全局内存并使主线程的 CPU 缓存无效,因此它必须从全局内存中读取更新的值。使上述代码正常工作的缓存一致性的全部意义不是吗?
c++ - std::this_thread::yield 只是一个提示会有问题吗?
我和同事讨论了一个假设的问题,当一个人想要用 实现自旋锁互斥锁std::atomic_flag
,但也不是将自旋锁实现为 while(true) 而是作为
基本上的想法是,即使它具有实时优先级,线程也不能“在很长时间内”阻塞其他线程,因为它会在一段时间后产生......但是当我看到 std::yield 的规范时,我很惊讶它是一个建议,不是强制性的。
为实现提供提示以重新安排线程的执行,从而允许其他线程运行。
http://en.cppreference.com/w/cpp/thread/yield
那会不会有问题?