- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在阅读 C++ Concurrency in Action安东尼·威廉姆斯。目前我在他描述 memory_order_consume 的地方。
在那 block 之后有:
Now that I’ve covered the basics of the memory orderings, it’s time to look at the more complex parts
这让我有点害怕,因为我不完全理解几件事:
dependency-ordered-before 与 synchronizes-with 有何不同?他们都创建了先发生后发生的关系。确切的区别是什么?
我对以下示例感到困惑:
int global_data[]={ … };
std::atomic<int> index;
void f()
{
int i=index.load(std::memory_order_consume);
do_something_with(global_data[std::kill_dependency(i)]);
}
kill_dependency 究竟做了什么?它杀死了哪种依赖?在哪些实体之间?编译器如何利用这些知识?
是否可以将所有出现的 memory_order_consume 安全地替换为 memory_order_acquire? IE。它在所有意义上都更严格吗?
在 list 5.9 中,我可以安全地替换
std::atomic<int> data[5]; // all accesses are relaxed
与
int data[5]
? IE。 acquire 和 release 可以用来同步访问非原子数据吗?
他通过一些人在小隔间里的例子描述了放松、获取和释放。 seq_cst和consume有没有类似的简单描述?
最佳答案
至于倒数第二个问题,答案需要多解释一下。当多个线程访问相同的数据时,可能会出现三种错误:
系统可能会在读取或写入过程中切换线程,产生的结果是一个值的一半和另一个值的一半。
假设没有其他线程查看所涉及的数据,编译器可能会四处移动代码。
处理器可能会在其本地缓存中保留一个值,而不会在更改值后更新主内存或在另一个线程更改主内存中的值后重新读取它。
内存顺序地址仅数字 3。原子函数地址 1 和 2,并且,根据内存顺序参数,也可能是 3。所以 memory_order_relaxed 的意思是“不要理会数字 3。代码仍然处理 1 和 2。在这种情况下,您将使用 acquire 和 release 来确保正确的内存排序。
关于C++ memory_order_consume, kill_dependency, dependency-ordered-before, 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14779518/
从链接: What is the difference between load/store relaxed atomic and normal variable? 这个回答给我留下了深刻的印象: U
我正在查看有关原子操作和发生前关系的 Boost 示例,但我有点困惑。在“通过发布和消费发生之前”部分,有以下示例,他们说这是错误的,但我看不到: atomic a(0); complex_data_
我有一个关于 GCC-Wiki article 的问题.在标题“Overall Summary”下,给出了以下代码示例: 线程 1: y.store (20); x.store (10); 线程 2:
我正在阅读 C++ Concurrency in Action安东尼·威廉姆斯。目前我在他描述 memory_order_consume 的地方。 在那 block 之后有: Now that I’v
我现在正在学习C++11 memory order model并想了解 memory_order_relaxed 和 memory_order_consume 之间的区别。 具体来说,我正在寻找一个无
在试图理解如何处理无锁代码的过程中,我尝试编写一个单一消费者/单一生产者无锁队列。一如既往,我检查了论文、文章和代码,特别是考虑到这是一个有点微妙的主题。 所以,我在 Folly 库中偶然发现了这个数
我是一名优秀的程序员,十分优秀!