Atomic 有没有一种方法可以通过C中的操作来确保原子性?

Atomic 有没有一种方法可以通过C中的操作来确保原子性?,atomic,Atomic,我希望此语句(在if语句体中)是原子的: if(I2C1STATbits.P || cmd_buffer_ptr >= CMD_BUFFER_SIZE - 1) cmd_buff_full = 1; // should be atomic 我的处理器(dsPIC33F)支持原子位设置和清除。它还支持16位寄存器和内存位置的原子写入;这些是单周期的。我如何确保操作将以原子方式实现?有没有办法强制编译器这样做?在我的例子中,我相当肯定它会编译成原子的,但是我不希望将来如果我,例如,更

我希望此语句(在if语句体中)是原子的:

if(I2C1STATbits.P || cmd_buffer_ptr >= CMD_BUFFER_SIZE - 1)
    cmd_buff_full = 1; // should be atomic
我的处理器(dsPIC33F)支持原子位设置和清除。它还支持16位寄存器和内存位置的原子写入;这些是单周期的。我如何确保操作将以原子方式实现?有没有办法强制编译器这样做?在我的例子中,我相当肯定它会编译成原子的,但是我不希望将来如果我,例如,更改一些其他代码,它会重新组织东西,或者如果我更新编译器,它会改变。例如,是否有一个
原子的
关键字


我正在使用GCC v3.23——更具体地说,是MPLAB C30,一个经过修改的GCC闭源代码版本。我在一个微控制器上工作,它只有中断;没有线程的概念。原子性的唯一可能的问题是,中断可能在写两个周期的中间触发,如果这是可能的话。

不在C中,但也许有一个专有的库调用在伴随着处理器的库中出现。例如,在Windows上,有一个InterlocatedIncrement()和InterlocatedDecrement()(到inc/dec longs)保证是原子的,没有锁。

根据您希望分配是原子的其他竞争操作,您可以使用。严格地说,这只能保护它不受信号的影响。实际上,它还提供原子性wrt。多重三分法


编辑:如果目标是保证存储操作没有编码到两条汇编指令中,则有必要使用内联汇编-C在这方面不作任何保证。如果目的是防止中断干扰存储操作,另一种方法是在存储之前禁用中断,然后启用它们。

我认为我的微控制器没有中断。我的变量是16位,所以我认为它是原子的,但我想确定一些优化不会改变它。我不确定我的微控制器库是否提供了这个。所以你应该检查它是否提供了。我不认为它提供了。它不支持信号或线程。那你为什么需要原子操作呢。Löwis:因为中断可能会中断两条指令之间的代码。