- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
所以我知道在 C++ 中没有什么是原子的。但我试图弄清楚是否有任何我可以做出的“伪原子”假设。原因是我想避免在一些我只需要非常弱的保证的简单情况下使用互斥锁。
1) 假设我已经全局定义了 volatile bool b,它
最初我设置为true。然后我启动一个执行循环的线程
while(b) doSomething();
bool b1=b;
bool b2=b;
if(b1 && !b2) bad();
最佳答案
标准C++中没有线程,而且Threads cannot be implemented as a library .
因此,该标准对使用线程的程序的行为没有任何说明。您必须查看线程实现提供的任何额外保证。
也就是说,在我使用的线程实现中:
(1) 是的,您可以假设不相关的值不会写入变量。否则整个内存模型就会消失。但是请注意,当您说“另一个线程”时,永远不要设置 b
为假,这意味着任何地方,永远。如果是这样,该写入可能会在您的循环期间重新排序。
(2) 否,编译器可以对 b1 和 b2 的赋值重新排序,因此 b1 可能最终为真,而 b2 为假。在这种简单的情况下,我不知道为什么会重新排序,但在更复杂的情况下,可能有很好的理由。
[编辑:哎呀,当我回答 (2) 时,我忘记了 b 是不稳定的。从 volatile 变量读取不会被重新排序,抱歉,所以在典型的线程实现上是的(如果有任何这样的事情),你可以假设你不会以 b1 true 和 b2 false 结束。]
(3) 同 1。volatile
通常与线程无关。然而,它在某些实现(Windows)中非常令人兴奋,并且实际上可能意味着内存障碍。
(4) 在一个架构上int
写入是原子的,虽然 volatile
与它无关。另见...
(5) 仔细检查文档。可能是的,而且 volatile 是无关紧要的,因为在几乎所有架构上 int
写入是原子的。但如果 int
write 不是原子的,那么没有(对于上一个问题也没有),即使它是 volatile 原则上你也可以获得不同的值。然而,鉴于这些值 7 和 8,我们正在谈论一个非常奇怪的架构,用于包含要在两个阶段写入的相关位的字节,但使用不同的值,您可能更可能获得部分写入。
举一个更合理的例子,假设出于某种奇怪的原因,您在一个只有 8 位写入是原子的平台上有一个 16 位 int。奇怪,但合法,因为 int
必须至少为 16 位,您可以看到它是如何产生的。进一步假设您的初始值为 255。那么增量可以合法地实现为:
-pthreads
.
int
的平台上。写入是原子的,但未对齐
int
写入是允许的,而不是原子的。例如 x86 上的 IIRC,未对齐
int
如果写入跨越缓存线边界,则不能保证写入是原子的。 x86 编译器不会错对齐声明的
int
变量,出于这个原因和其他原因。但是如果你玩结构包装的游戏,你可能会引发一个例子。
关于c++ - "pseudo-atomic"C++ 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2751965/
我已经为我的项目配置了 tailwindcss,但是在 npm run start 之后我得到了以下错误。 (node:7032) UnhandledPromiseRejectionWarning:错
我使用 create-react-app 创建了一个应用程序并且在尝试构建生产优化版本时遇到错误 yarn build : > yarn build help yarn run v1.9.4 $ re
我正在寻找一种将 :content 伪元素添加到空元素的方法,并遇到了 :empty CSS 伪选择器,它看起来像会达到我正在寻找的目的。基本上,我想添加一个通用消息,如“Nothing found”
Font Awesome 未提供 :after伪。是否可以使用 :after默认情况下而不是 :before伪? 例如,如果我使用:facebook那么图标应该使用:after而不是 :before
我想在禁用时更改切换按钮的颜色。我使用 :before fetaure of css 实现了这个切换。代码位于 https://jsfiddle.net/sachin8085/adm5t7rz/6/
我最近在 Firefox 中发现了一个警告 Warning: Unknown pseudo-class or pseudo-element 'hidden' 这是页面 http://eleven23.
我有一个多项式 data Poly a = Poly [a] 我希望能够做类似 fmap (take 3) polynomial 的事情但我不能,因为 Poly不是真正的仿函数,因为 f我在 fmap
我想将某种样式应用到一个元素的所有后代,除了一些。 这是我正在尝试实现的示例:http://jsfiddle.net/f8FLe/ .root * :not(.nested) { color:
我正在学习 Haskell 中的代数 DT。我想做的是创建一个新的 ADT 来“扩展”现有的 ADT。我找不到如何表达我想要的东西,有人可以建议替代模式或建议解决方案。我希望它们是不同的类型,但复制和
我现在正在通过将所有内容包含在一个函数中,将全局变量变成“伪全局变量”,从而从我的代码中删除大部分全局变量,这些全局变量都可以从该函数 block 内的任何地方访问。 (function(){ var
我正在尝试创建动画时间轴。当时间轴出现时,我正在使用滚动显示来触发动画。每个时间线条目都有一个左边框和一个伪元素 :before 与之关联。 :before 元素是一个标记每个时间线条目开始的点。当动
我的大脑并没有完全围绕这个:我正在使用我的 h1 上的 :before 和 :after 伪元素>。我的 h1 有一个 100% 宽度。 我希望 :after 是一个重复的背景图形,填充空白,后置文本
是否可以在 :before 伪类的内容中添加类或 ID?我知道这行不通,但是类似: #menu { height: 100px; width: 100px; } #menu:befor
假设我有一个带有下划线的跨度: Hello, I'm underlined text .underline { color: #444; font-size: 250%; display:
这个问题在这里已经有了答案: CSS selector with period in ID (3 个答案) 关闭 6 年前。
我正在尝试将 :after 伪元素移动到 div 的末尾,有点像页脚。 Some content here .box { height: 60vh; } .box:after {
在您指定内容之后,:AFTER 和:BEFORE 伪元素的默认display: 属性是什么。 是display: inline还是display: inline-block? 无法在 default
我遇到这样一种情况,我有两个元素在 DOM(邻居)中处于同一级别。当我悬停在 DOM 中之前的元素时,我希望显示它下面的元素。我还想访问我正在显示的元素的子元素并显示其 :before 伪元素。 SC
我有一个样式规则: .tabs li { border: 1px solid transparent; } .tabs li:not(:last-child):not(:nth-child(2
我有两个相同的 CSS 规则,但一个没有覆盖另一个。 我使用了 right 而不是 left 规则,但它不会覆盖 left 规则。另一方面 top 规则正在覆盖。我也使用了 !important 规则
我是一名优秀的程序员,十分优秀!