相关疑难解决方法(0)

num ++是'int num'的原子吗?

一般地,对于int num,num++(或++num),作为读-修改-写操作中,是不是原子.但我经常看到编译器,例如GCC,为它生成以下代码(在这里尝试):

在此输入图像描述

由于第5行对应于num++一条指令,我们可以得出结论,在这种情况下num++ 是原子的吗?

如果是这样,是否意味着如此生成num++可以在并发(多线程)场景中使用而没有任何数据争用的危险(例如,我们不需要制作它,std::atomic<int>并强加相关成本,因为它是无论如何原子)?

UPDATE

请注意,这个问题不是增量是否原子的(它不是,而且是问题的开头行).它是否可以在特定场景中,即在某些情况下是否可以利用单指令性质来避免lock前缀的开销.而且,作为公认的答案约单处理器的机器,还有部分提到这个答案,在其评论和其他人谈话解释,它可以(尽管不是C或C++).

c c++ assembly multithreading atomic

148
推荐指数
8
解决办法
1万
查看次数

在C++ 11中是否有任何编译器障碍等于asm("":::"memory")?

我的测试代码如下,我发现只有memory_order_seq_cstforbade编译器重新排序.

#include <atomic>

using namespace std;

int A, B = 1;

void func(void) {
    A = B + 1;
    atomic_thread_fence(memory_order_seq_cst);
    B = 0;
}
Run Code Online (Sandbox Code Playgroud)

而其他选择memory_order_release,memory_order_acq_rel根本没有产生任何编译屏障.

我认为他们必须使用原子变量,如下所示.

#include <atomic>

using namespace std;

atomic<int> A(0);
int B = 1;

void func(void) {
    A.store(B+1, memory_order_release);
    B = 0;
}
Run Code Online (Sandbox Code Playgroud)

但我不想使用原子变量.与此同时,我认为"asm("":::"记忆")"太低了.

还有更好的选择吗?

c++ atomic lock-free memory-barriers c++11

3
推荐指数
1
解决办法
959
查看次数

使用谓词指令将c转换为程序集

我想使用谓词指令将此代码转换为汇编

If (A>B){

    C=A;
    D=B;
    E=0

}

else{

    C=B;
} 
Run Code Online (Sandbox Code Playgroud)

它是正确的还是我如何使用跳跃?

cmp R1,R2; considering B is assigned to R2 and A assigned to R1
movlf R3,R1;R3 assign to C
mov R4,R2;R4 assign to D
mov R5,0; R5 assign to E
movlt R3,R2
Run Code Online (Sandbox Code Playgroud)

c assembly arm predicates

-2
推荐指数
1
解决办法
422
查看次数