- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
int main() {
std::vector<int> foo;
std::atomic<int> bar{0};
std::mutex mx;
auto job = [&] {
int asdf = bar.load();
// std::lock_guard lg(mx);
foo.emplace_back(1);
bar.store(foo.size());
};
std::thread t1(job);
std::thread t2(job);
t1.join();
t2.join();
}
这显然不能保证工作,但可以使用互斥锁。但是如何用标准的正式定义来解释呢?
If an atomic store in thread A is tagged memory_order_release and anatomic load in thread B from the same variable is taggedmemory_order_acquire [as is the case with default atomics], all memory writes (non-atomic and relaxedatomic) that happened-before the atomic store from the point of viewof thread A, become visible side-effects in thread B. That is, oncethe atomic load is completed, thread B is guaranteed to see everythingthread A wrote to memory.
最佳答案
引用的这段话的意思是,当 B 加载 A 存储的值时,那么通过观察存储发生了,也可以确保 B 在存储之前所做的一切也发生了并且是可见的。
但是,如果商店实际上还没有发生,这并不能告诉您任何事情!
实际的 C++ 标准更明确地说明了这一点。 (永远记住,cppreference 虽然是一种经常引用或解释标准的宝贵资源,但它不是标准本身,也不具有权威性。)来自 N4861 ,最终的 C++20 草案,我们在 atomics.order p2 中有:
An atomic operation A that performs a release operation on an atomic object M synchronizes with an atomicoperation B that performs an acquire operation on M and takes its value from any side effect in the releasesequence headed by A.
foo
.在这种情况下,B 中的负载与 A 中的存储同步,因为负载的值(即 1)来自存储(这是其自己的释放序列的一部分)。
int main() {
std::vector<int> foo;
std::atomic<int> bar{0};
std::mutex mx;
auto jobA = [&] {
foo.emplace_back(1);
bar.store(foo.size());
};
auto jobB = [&] {
while (bar.load() == 0) /* spin */ ;
foo.emplace_back(1);
};
std::thread t1(jobA);
std::thread t2(jobB);
t1.join();
t2.join();
}
关于c++ - 为什么这个 cppreference 摘录似乎错误地暗示原子可以保护关键部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65499906/
我需要在我的网站中实现自动建议功能,并且我需要一些易于开发或编辑的 java 脚本框架或代码,并且自动建议将是多个字段 最佳答案 适配 jQuery:http://jqueryui.com/ 关于ja
在下面的示例中,SonarQube 提示 model.toString() 是 not null 并且 (model == null) 始终 false,需要一些帮助来了解可以采取哪些措施来修复它。因
我正在尝试创建自定义 iOS 键盘。我使用 UILexicon 类来提供 requestSupplementaryLexiconWithCompletion: 方法提供的基本词库。 但我也想将预测文本
如何断言如果 X 为 true 那么 Y 也为 true。问题是,如果我写以下内容: assert(X && Y && "If X is true then Y should be true too.
创建路径中包含两个反斜杠的文件时,是否会产生任何不可预见的后果。 在此代码中,文件创建正常,但我想知道在使用此文件的过程中是否有任何副作用。 HANDLE hFile = CreateFile(
在下面的示例中,SonarQube 提示 bookmark 可能为 null 或为 null,需要一些帮助来了解可以采取哪些措施来修复它。因为 bookmark 在 for 循环中被初始化为变量,并且
这个问题在这里已经有了答案: Partial ordered Comparator (6 个答案) 关闭 8 年前。 我有一组序列化到文件中的项目。有些项目可以依赖其他项目,但不允许循环引用。因此,
我想创建将始终使用 gcc/g++/clang 支持的 C/C++ 标准的“最新”版本的 shell 别名/clang++(C的一个别名,C++的一个别名)。我意识到这可能有多种解释: 最新的 GNU
我是一名优秀的程序员,十分优秀!