请问:C整形变量赋数值、++、--等是不是原子操作?

2019-12-27 18:58发布

就是如同下面的例子:

int i;

i = 123;
i++;
i--;

诸如此类......
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
36条回答
flamma
1楼-- · 2019-12-30 22:45
另外ARM系列也有atomic系列的函数。有些ARM架构的atomic实现里面就有开关中断,有些架构的实现就不会开关中断。比如M0,M3,M4的实现:

#define ATOMIC_OP(asm_op, a, v) do {                               
        uint32_t reg0;                                               
                                                               
        __asm__ __volatile__("   cpsid i "                       
                             "   ldr  %0, [%1] "               
                             #asm_op" %0, %0, %2 "               
                             "   str  %0, [%1] "               
                             "   cpsie i "                       
                             : "=&b" (reg0)                       
                             : "b" (a), "r" (v) : "cc");       
} while (0)

static inline void atomic_add(uint32_t volatile *addr, uint32_t value)
{
        ATOMIC_OP(add, addr, value);
}
static inline void atomic_sub(uint32_t volatile *addr, uint32_t value)
{
        ATOMIC_OP(sub, addr, value);
}

这里就看出这样的好处是多并发的程序不需要频繁的开关中断和lock/unlock,会有很大的性能提升。同样可以看出,指令上还是有开销的。
myxiaonia
2楼-- · 2019-12-30 22:46
flamma 发表于 2017-5-23 16:56
原子的操作的实现是有的,叫做LOCK-FREE,基本上就是基于CAS或者 Fetch And xxx来实现的。很多编译器和CPU ...

好像就是这个,可以贴贴实现代码,用了互斥访问指令
prince2010
3楼-- · 2019-12-31 04:15
security 发表于 2017-5-23 12:00
就是:volatile + 关开中断。
我之前说的可能文绉绉了。

是这两个吗——

        __set_PRIMASK(1);//关总中断

        __set_PRIMASK(0);//开总中断



security
4楼-- · 2019-12-31 04:46
prince2010 发表于 2017-6-1 16:28
是这两个吗——

        __set_PRIMASK(1);//关总中断

是的。。
prince2010
5楼-- · 2019-12-31 09:53
 精彩回答 2  元偷偷看……
prince2010
6楼-- · 2019-12-31 10:45
落叶知秋 发表于 2017-5-22 19:45
据我所知,i++和i--不是原子操作,被坑过

不知道你是怎么被坑的,可以发个例程吗?

一周热门 更多>