这个线程安全吗? (没有互斥锁/信号量的共享数据)

时间:2009-10-08 20:21:47

标签: multithreading thread-safety interrupt

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

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

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

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

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

5 个答案:

答案 0 :(得分:2)

只要读取和写入都是原子操作,它就应该没问题。读取或写入所需的时间并不重要,但如果它们是1个周期,它们似乎是原子的。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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