所以这是一个非常特殊的问题:
我使用具有单个 CPU 内核的嵌入式系统。
我有一个主线程和一个中断。它们共享一个 32 位浮点数。中断写入浮点数,主线程读取它。读取和写入不同步。
处理器文档声明 32 位读取是一个单周期操作。
我的评估是否正确,主线程没有读取损坏值的风险?还是有其他因素?
所以这是一个非常特殊的问题:
我使用具有单个 CPU 内核的嵌入式系统。
我有一个主线程和一个中断。它们共享一个 32 位浮点数。中断写入浮点数,主线程读取它。读取和写入不同步。
处理器文档声明 32 位读取是一个单周期操作。
我的评估是否正确,主线程没有读取损坏值的风险?还是有其他因素?
只要读写都是原子操作,应该没问题。读取或写入需要多长时间并不重要,尽管如果它们是 1 个周期,它们似乎很可能是原子的。
听起来你很安全。如果一次完成读取,则没有人只能写入一半的字节。话虽如此,您确实需要确保线程始终真正读取该值,而不是被编译器优化掉。如果编译器认为没有人可以从外部更改变量,则可能会发生这种情况。将其声明为 volatile 应该可以解决问题(如果适用的话-我不熟悉您的代码)。
我认为只要中断例程不读取该值就可以了,然后使用该值计算要写入的新值。
文档是否还声明写入需要一个周期?如果没有,那么你需要保护。
应该是安全的 - 如果您怀疑不是,您可以在读取值之前禁用中断,然后在读取后启用。但我很确定你很好——
原子读/写可能不是使操作线程安全的唯一考虑因素。我认为答案也取决于操作系统内存模型。您需要确保主线程中的读取将获得中断写入的最新值。