1

所以这是一个非常特殊的问题:

我使用具有单个 CPU 内核的嵌入式系统。

我有一个主线程和一个中断。它们共享一个 32 位浮点数。中断写入浮点数,主线程读取它。读取和写入不同步。

处理器文档声明 32 位读取是一个单周期操作。

我的评估是否正确,主线程没有读取损坏值的风险?还是有其他因素?

4

5 回答 5

2

只要读写都是原子操作,应该没问题。读取或写入需要多长时间并不重要,尽管如果它们是 1 个周期,它们似乎很可能是原子的。

于 2009-10-08T20:28:44.673 回答
1

听起来你很安全。如果一次完成读取,则没有人只能写入一半的字节。话虽如此,您确实需要确保线程始终真正读取该值,而不是被编译器优化掉。如果编译器认为没有人可以从外部更改变量,则可能会发生这种情况。将其声明为 volatile 应该可以解决问题(如果适用的话-我不熟悉您的代码)。

于 2009-10-08T20:36:29.883 回答
0

我认为只要中断例程不读取该值就可以了,然后使用该值计算要写入的新值。

文档是否还声明写入需要一个周期?如果没有,那么你需要保护。

于 2009-10-08T20:32:25.617 回答
0

应该是安全的 - 如果您怀疑不是,您可以在读取值之前禁用中断,然后在读取后启用。但我很确定你很好——

于 2009-10-08T20:34:07.203 回答
0

原子读/写可能不是使操作线程安全的唯一考虑因素。我认为答案也取决于操作系统内存模型。您需要确保主线程中的读取将获得中断写入的最新值。

于 2009-10-08T20:34:08.390 回答