问题标签 [memory-model]
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++ - exchange 或 compare_and_exchange 是否按修改顺序读取最后一个值?
我正在阅读Anthony Williams 的C++ Concurrency in Action。在“了解轻松排序”部分,它具有:
您还可以告诉隔间里的人一些额外的事情,例如“写下这个数字,并告诉我列表底部是什么”(交换)和“如果底部的数字,写下这个数字清单是这样的;否则告诉我我应该猜到什么”(compare_exchange_strong),但这并不影响一般原则。
这是否意味着此类操作总是按修改顺序读取最后一个值(如果在约束之前没有发生额外的线程间)?即是否有一些缓存更新/等(即使在宽松的排序中)?
c++ - 非原子对象在所有线程中是否具有相同的修改顺序?(在没有数据竞争的情况下)
1.10/6:
对特定原子对象 M 的所有修改都以某个特定的总顺序发生,称为 M 的修改顺序。
非原子对象在所有线程中也有相同的修改顺序吗?我对正确同步的案例(没有数据竞争等)感兴趣。
c++ - 使用空类类型对象的内存
由于在 C++sizeof
中一个空类是 1 个字节,下面的代码是否有效?
我知道它几乎没用,但只是想看看我是否可以做到这一点。它在 MSVC2010 上编译并运行良好。
c++ - 获取/释放与顺序一致的内存顺序
对于任何std::atomic<T>
T 是原始类型的地方:
如果我盲目地使用std::memory_order_acq_rel
for fetch_xxx
operations 和std::memory_order_acquire
for load
operation 和std::memory_order_release
for store
operation (我的意思是就像重置这些函数的默认内存顺序一样)
- 结果是否与我
std::memory_order_seq_cst
对任何声明的操作使用(默认使用)相同? - 如果结果相同,那么
std::memory_order_seq_cst
在效率方面,这种用法与使用有何不同?
c++ - 对 shared_ptr 析构函数中的实现错误感到困惑
我刚刚看过 Herb Sutter 的演讲:C++ 和超越 2012:Herb Sutter - atomic<> Weapons, 2 of 2
他在 std::shared_ptr 析构函数的实现中显示了错误:
他说,由于 memory_order_relaxed,delete 可以放在 fetch_sub 之前。
在 1:25:18 - Release 没有将 B 行保留在它应该在的位置
这怎么可能?存在先发生/先排序关系,因为它们都在单线程中。我可能错了,但是 fetch_sub 和 delete 之间也存在依赖关系。
如果他是对的,哪些 ISO 项目支持这一点?
x86 - x86 微处理器的内存限制
我最近从一个在线资源开始学习计算机体系结构课程。我从我拿起的一本书中读到,x86 处理器有 32 条地址线,可以在数据总线上一次读取 4 个字节的数据。现在我了解到 32 条地址线将可寻址内存限制为 40 亿个唯一地址。我难以理解的事实是,如果 CPU 可以在每个周期从这 40 亿个唯一地址中的每一个读取 4 个字节的数据,为什么 x86 系统上的 RAM 限制为 4 GB。它不应该是 16 GB(4 乘以 4 GB)吗?有人可以帮我解决这个问题吗?另外,当我谈到 32 位或 64 位微处理器时,32/64 是指 CPU 上的地址线数还是数据线数?(对于我的第一个问题,我可能应该提到我'
c++ - 什么是 C++11 标准中的消费操作?
我已经看到这个关于获取、释放、消费等的问题存在,但是,没有答案真正定义“消费操作”实际上是什么。
在 1.10 第 5 段中,它指出:
一个或多个内存位置上的同步操作是消耗操作、获取操作、释放操作或获取和释放操作。
我想知道是否有人可以解释 C++11 标准第 1.10 节中使用的这是什么?
c++ - 释放/获取语义 wrt std::mutex
我正在阅读 n3485 中定义的 C++ 内存模型,它讨论了释放/获取语义,据我了解,以及此博客中给出的定义:
获取语义是一个只能应用于从共享内存读取的操作的属性,无论它们是读-修改-写操作还是普通加载。然后将该操作视为读取-获取。Acquire 语义可防止读取-acquire 的内存重新排序,以及按照程序顺序跟随它的任何读取或写入操作。
释放语义是一个只能应用于写入共享内存的操作的属性,无论它们是读-修改-写操作还是普通存储。然后该操作被认为是写释放。释放语义防止写释放的内存重新排序,任何读或写操作在程序顺序之前。
将防止在当前读/写完成之前或之后对读/写进行重新排序。第一个(获取)将确保当前正在完成的读取不会被任何读/写重新排序,后者(发布)将确保当前写入不会被之前的读/写操作重新排序它。
现在可以说std::mutex::lock
将具有获取语义并且std::mutex::unlock
本质上具有释放语义吗?
在标准中,我可以在部分下找到它
30.4.1.2 互斥体类型 [thread.mutex.requirements.mutex]
11 同步:
unlock()
对同一对象的先前操作应与(1.10)此操作同步。
据我了解,标准中没有明确定义同步,但是它似乎是一种发生在关系之前查看两个不同线程之间正在评估的两个语句的类型,但是,根据我对获取/释放语义的理解,这有更多与内存重新排序有关。 同步也可以称为释放/获取语义?
那么释放/获取语义是否不仅适用于加载/存储操作的重新排序,也适用于操作的线程内交错?
在关于内存模型的标准部分中,它主要讨论的是两个线程交错的有序关系。这对于这是否也适用于内存排序有待解释。
有人可以澄清吗?
concurrency - x86_64 内存重新排序
在 x86_64 架构上,以下代码是否始终成立:
A=1;B=1;
线程1:存储A=2;商店 B=3;线程2:加载B==3;负载 A==2
有没有 B==3 但 A==1 的可能性?
verilog - 我怎样才能减少多路复用器的大小
这是我用于内存模块设计的简单verilog代码(我想让我的代码更高效)
另外当我写data_output[0:7]= memory[address][0:7]; 它创建了一个 8X1 多路复用器
通过写作
我是否减少了多路复用器的大小???
;