- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
bool compare_exchange_weak (T& expected, T val, ..);
compare_exchange_weak()
是 C++11 中提供的比较交换原语之一。它是
弱 从某种意义上说,即使对象的值等于
expected
,它也会返回 false。 .这是由于
虚假故障 在一些使用一系列指令(而不是 x86 上的指令)来实现它的平台上。在这样的平台上,上下文切换、另一个线程重新加载相同地址(或缓存行)等可能会使原语失败。它是
spurious
因为它不是操作失败的对象的值(不等于
expected
)。相反,这是一种时间问题。
29.6.5..A consequence of spurious failure is that nearly all uses of weakcompare-and-exchange will be in a loop.
compare_exchange_weak()
并自己编写循环?我们可以使用
compare_exchange_strong()
我认为这应该为我们摆脱虚假的失败。
compare_exchange_weak()
的常见用例有哪些?
//Because compare_exchange_weak() can fail spuriously, it must typically
//be used in a loop:
bool expected=false;
extern atomic<bool> b; // set somewhere else
while(!b.compare_exchange_weak(expected,true) && !expected);
//In this case, you keep looping as long as expected is still false,
//indicating that the compare_exchange_weak() call failed spuriously.
为什么是
!expected
有在循环条件?是否可以防止所有线程可能会饿死并且在一段时间内没有任何进展?
// use LL/SC (or CAS on x86) and ignore/loop on spurious failures
while (!compare_exchange_weak(..))
{ .. }
// use LL/SC (or CAS on x86) and ignore/loop on spurious failures
while (!compare_exchange_strong(..))
{ .. }
我提出了最后一个问题,你们都提到循环内可能存在性能差异。 C++11 标准 (ISO/IEC 14882) 也提到了这一点:
When a compare-and-exchange is in a loop, the weak version will yieldbetter performance on some platforms.
最佳答案
为什么要循环交换?
通常,您希望在继续之前完成您的工作,因此,您输入 compare_exchange_weak
进入一个循环,以便它尝试交换直到成功(即返回 true
)。
请注意,还有 compare_exchange_strong
经常在循环中使用。它不会因虚假故障而失败,但会因并发写入而失败。
为什么要使用 weak
而不是 strong
?
很简单:虚假故障不会经常发生,因此不会对性能造成太大影响。相比之下,容忍这种失败可以更有效地实现 weak
某些平台上的版本(与 strong
相比):strong
必须始终检查虚假故障并将其屏蔽。这是昂贵的。
因此,weak
使用它是因为它比 strong
快很多在某些平台上
什么时候应该使用 weak
当 strong
?
reference状态提示何时使用 weak
以及何时使用 strong
:
When a compare-and-exchange is in a loop, the weak version will yieldbetter performance on some platforms. When a weak compare-and-exchangewould require a loop and a strong one would not, the strong one ispreferable.
strong
.如果你有一个循环,那么使用
weak
.
!expected
在示例中
false
的情况下,语义可能会略有不同(但我找不到你想要的有意义的例子)。见
Tony D.'s comment的详细解释。
true
时,它只是一个快速 channel : 然后我们中止而不是尝试写
true
再次。
But as analyzed above, two versions in a loop should give the same/similar performance.What's the thing I miss?
Real implementations of LL/SC do not always succeed if there are noconcurrent updates to the memory location in question. Any exceptionalevents between the two operations, such as a context switch, anotherload-link, or even (on many platforms) another load or storeoperation, will cause the store-conditional to spuriously fail. Olderimplementations will fail if there are any updates broadcast over thememory bus.
false
)。弱版本没有这样自己的循环。
strong
的示例中版本,失败检查进行了两次;一次来自
compare_exchange_strong
(这更复杂,因为它必须区分虚假故障和并发访问)和一次由您的循环。这项昂贵的检查是不必要的,这也是
weak
的原因这里会更快。
std::atomic
必须支持所有可能的数据类型的所有操作,所以即使你声明了一个千万字节的结构体,你也可以使用
compare_exchange
在这一点上。即使在具有 CAS 的 CPU 上,您也不能 CAS 一千万字节,因此编译器会生成其他指令(可能是锁获取,然后是非原子比较和交换,然后是锁释放)。现在,想想在交换一千万字节时会发生多少事情。因此,虽然对于 8 字节交换而言,虚假错误可能非常罕见,但在这种情况下可能更常见。
weak
),另一种是“无论中间可能发生多少坏事,我都会这样做”(
strong
)。如何在各种数据类型和平台上实现这些是一个完全不同的话题。不要将您的心智模型与特定平台上的实现联系起来;标准库旨在处理比您可能意识到的更多的体系结构。我们可以得出的唯一一般结论是,保证成功通常比仅仅尝试并为可能的失败留出空间更困难(因此可能需要额外的工作)。
关于c++ - 理解 C++11 中的 std::atomic::compare_exchange_weak(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25199838/
我有一台计算机在一个非常严格的代理服务器后面,它只允许我上网和下载程序它不允许像 Atom 文本编辑器这样的程序下载它的包。 我的问题是如何仅使用基于浏览器的下载来安装它们? 最佳答案 这当然是可能的
我的 keymap.cson 文件中有这个: 'body': 'ctrl-alt-left': 'editor:select-to-first-character-of-line' 但是不行(没有
如何获取 Atom 中所有已安装和已激活插件的列表? 我可以用 apm list --installed --bare获取所有已安装的软件包,但我不想包含禁用的软件包。而且我有很多禁用的包。 最佳答案
我在 OSX 上,在 Atom 中打开了一个我没有命名的文件。我不得不重新启动计算机,当它再次出现时,我点击了错误的东西,它忘记了所有旧文件名,并且未命名的文件似乎消失得无影无踪。如果我使用 Time
当我搜索某个字符串(“在目录中搜索”)时,atom 允许做两件事:指定目录或文件扩展名(但它会在项目中的所有目录中搜索)。是否可以同时进行?例如。我想在 'src' 目录中进行递归搜索,但只使用 *.
我将 OSX 更新为 High Sierra,我的 Atom 停止从命令行工作。 $ atom . FSPathMakeRef(/Applications/Atom.app) failed with
下面屏幕截图中第 95 行和第 96 行之间的红色箭头在 GitHub 的 Atom 编辑器上意味着什么? 谢谢! 最佳答案 如果您当前打开的项目使用 Git 作为修订系统,装订线中的箭头表示您删除了
某些代码编辑器(例如 WebStorm)可以选择在编辑器失去焦点时自动保存。我在 Atom 编辑器中搜索了类似的选项,但尚未找到任何内容。 Atom 编辑器是否有一个设置,允许在失去焦点时自动保存已编
有没有办法(插件或其他东西)在 Atom 编辑器中使用分屏? 我查看了菜单,但找不到任何相关选项。 最佳答案 使用命令面板 使用 cmd + shift + p (OSX) 或 ctrl + 打开命令
我在 Atom 中安装了一个有缺陷的软件包,它导致编辑器反复崩溃。因此,我进入 Atom 设置将其删除,但出于好奇,我事先单击了“打开配置文件夹”按钮,这打开了一个空窗口和开发工具: Atom 随后崩
我已经使用atom.io有一段时间了并且非常喜欢它。我只缺少一件事。我以前使用过bracket和sublime,它们都有一个功能,你只需输入html就可以创建html文档的基本结构。 这只会设置 ht
我尝试在 Atom 编辑器中安装软件包,但总是失败,就像我无法连接到服务器一样。 例如,apm install split-diff 返回请求包信息失败:getaddrinfo ENOTFOUNDat
我使用的是 OSX El Capitan 和 Atom 1.2.4。而且我还安装了“tabs-to-spaces”包。 我正在尝试将编辑器设置为缩进并使制表符为 2 个空格。但我无法完成这项工作,这是
我使用的是 Atom 1.0.15。启动时,Atom 每次都会尝试打开 MTP 设备上的文件,这非常烦人。即使关闭引用 MTP 设备上的文件的选项卡后,Atom 也会尝试在下次启动时重新打开它。 修复
我在 Atom 中安装了一个有缺陷的软件包,它导致编辑器反复崩溃。因此,我进入 Atom 设置将其删除,但出于好奇,我事先单击了“打开配置文件夹”按钮,这打开了一个空窗口和开发工具: Atom 随后崩
我尝试在 Atom 编辑器中安装软件包,但总是失败,就像我无法连接到服务器一样。 例如,apm install split-diff 返回请求包信息失败:getaddrinfo ENOTFOUNDat
在 Atom 文本编辑器上,不同的文件树颜色代表什么。我的文件有 3 种不同的颜色:黑色、绿色和橙色。黑色文件无法正常运行,而绿色文件运行良好。如果有人知道颜色的具体含义,请告诉我。 最佳答案 颜色指
我正在尝试通过 Atom 进行完整搜索,寻找特定的文本。嗯,这听起来很简单,使用 Command + Shift + F ,但是,不会跟踪 node_modules ,并且不会扫描这些目录内的内容。我
以下是我在snippets.cson 文件中编写的两个片段: '.source.python': 'print statement': 'prefix': 'pr' 'body'
我试过在这里查看其他有类似问题的问题,但不幸的是我没能解决这个问题。 关于一些基本背景信息,我目前在实验室中使用 PC,并且实验室在机构的某个地方有 GPU 服务器。我正在尝试将 Atom 编辑器连接
我是一名优秀的程序员,十分优秀!