C ++同步和原子软件事务存储

问题描述

我阅读了cppreference上有关事务性存储器的临时特性的指南,并尝试了它。

我用sincronized写了一些简单的代码,比如说cpp引用不是事务,而是仅保证块中的操作以总顺序执行,我用{{1}编写了相同的代码}和atomic_noexcept,而不是似乎尚未实现的atomic_commit

我对atomic_cancelatomic_noexceptatomic_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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...