我应该互斥锁一个变量吗?

时间:2011-07-01 20:56:12

标签: c embedded

如果在多个线程之间共享一个32位变量,我应该在变量周围放置一个互斥锁吗?例如,假设1个线程写入32位计数器,第2个线程读取它。第二个线程是否有可能读取损坏的值?

我正在研究32位ARM嵌入式系统。编译器似乎总是对齐32位变量,因此可以使用单个指令读取或写入它们。如果32位变量未对齐,则读取或写入将被分解为多个指令,第二个线程可能会读取损坏的值。

如果我将来迁移到多核系统并且核心之间共享变量,这个问题的答案是否会改变? (假设核心之间有共享缓存)

谢谢!

4 个答案:

答案 0 :(得分:8)

互斥锁可以保护您免受撕裂 - 例如某些ARM实现使用无序执行,而互斥锁将包含可能对您的算法正确性所必需的内存(和编译器)障碍。

包含互斥锁更安全,然后找出一种方法来优化它,如果它显示为性能问题。

另请注意,如果您的编译器是基于GCC的,则您可以访问GCC atomic builtins

答案 1 :(得分:4)

如果所有的写入都是从一个线程完成的(即其他线程只读取),那么你不需要互斥锁。如果可能多个帖子正在写,那么你就可以了。

答案 2 :(得分:3)

您不需要互斥锁。 在32位ARM上,单次写入或读取是原子操作。 (无论核心数量) 当然,您应该将该变量声明为volatile。

答案 3 :(得分:1)

在32位系统上,32位变量的读写是原子的。但是,这取决于你对变量做了什么。例如。如果你以某种方式操纵它(例如添加一个值),那么这需要读取,操作和写入。如果CPU和编译器不支持对此进行原子操作,则需要使用互斥锁来保护此多操作序列。

还有其他无锁技术可以减少对互斥锁的需求。