问题描述
我阅读了cppreference上有关事务性存储器的临时特性的指南,并尝试了它。
我用sincronized
写了一些简单的代码,比如说cpp引用不是事务,而是仅保证块中的操作以总顺序执行,我用{{1}编写了相同的代码}和atomic_noexcept
,而不是似乎尚未实现的atomic_commit
。
我对atomic_cancel
,atomic_noexcept
和atomic_commit
之间的区别感到怀疑,显然它们以相同的方式工作,在原子块中调用交易安全函数。
因此,我分析了三种变体的汇编代码,并得出了相同的结果,如下所示:
cpp atomic_noexcept:
synchronized
程序集atomic_no除外:
int a;
void thread_func() {
atomic_noexcept
{
++a;
}
}
cpp atomic_commit:
thread_func():
subq $8,%rsp
movl $43,%edi
xorl %eax,%eax
call _ITM_beginTransaction
testb $2,%al
jne .L2
movl $a,%edi
call _ITM_RfWU4
movl $a,%edi
leal 1(%rax),%esi
call _ITM_WaWU4
call _ITM_commitTransaction
addq $8,%rsp
ret
.L2:
addl $1,a(%rip)
addq $8,%rsp
jmp _ITM_commitTransaction
a:
.zero 4
程序集atomic_commit:
int a;
void thread_func() {
atomic_commit
{
++a;
}
}
cpp同步:
thread_func():
subq $8,%rsp
jmp _ITM_commitTransaction
a:
.zero 4
程序集已同步:
int a;
void thread_func() {
synchronized
{
++a;
}
}
它们如何工作不同?例如,我报告了cppreference不同原子块的解释:
atomic_noexcept :如果引发异常,则调用std :: abort
atomic_cancel :如果引发异常,则会调用std :: abort, 除非该例外是用于交易的例外之一 取消(请参阅下文),在这种情况下,交易被取消: 程序中所有已修改内存位置的值 原子块操作的副作用被恢复为 他们在原子块开始时的值是 执行后,异常将照常继续展开堆栈。
atomic_commit :如果引发异常,则事务为 正常提交。
如果thread_func():
subq $8,%rsp
jmp _ITM_commitTransaction
a:
.zero 4
具有相同的汇编代码,该如何与atomic_noexcept
不同?
如果汇编代码相同,同步块如何与原子块不同?
编辑:
所有这些测试和汇编代码均摘自最新版本的GCC(V.10.2)
EDIT2:
经过一些测试和研究,我还没有找到关于所述不同行为的合理解释。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)