首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在C中确保操作的原子性?

有没有办法在C中确保操作的原子性?
EN

Stack Overflow用户
提问于 2010-12-11 05:18:02
回答 2查看 961关注 0票数 1

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

代码语言:javascript
复制
if(I2C1STATbits.P || cmd_buffer_ptr >= CMD_BUFFER_SIZE - 1)
    cmd_buff_full = 1; // should be atomic

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-11 05:38:18

根据您希望赋值为原子的其他竞争操作,您可以使用sig_atomic_t。严格地说,这只会保护它不受信号的影响。在实践中,它还提供了原子性wrt。多三头。

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

票数 3
EN

Stack Overflow用户

发布于 2010-12-11 05:25:56

不是在C中,但可能在处理器附带的库中有专有的库调用。例如,在Windows上,有一个InterlockedIncrement()和InterlockedDecrement() (对于inc/dec long),它们被保证是原子的,没有锁。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4413405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档