如果在多个线程之间共享一个32位变量,我应该在变量周围放置一个互斥锁吗?例如,假设1个线程写入32位计数器,第2个线程读取它。第二个线程是否有可能读取损坏的值?
我正在研究32位ARM嵌入式系统。编译器似乎总是对齐32位变量,因此可以使用单个指令读取或写入它们。如果32位变量未对齐,则读取或写入将被分解为多个指令,第二个线程可能会读取损坏的值。
如果我将来迁移到多核系统并且变量在核心之间共享,那么这个问题的答案是否会改变? (假设核心之间有共享缓存)
谢谢!
如果在多个线程之间共享一个32位变量,我应该在变量周围放置一个互斥锁吗?例如,假设1个线程写入32位计数器,第2个线程读取它。第二个线程是否有可能读取损坏的值?
我正在研究32位ARM嵌入式系统。编译器似乎总是对齐32位变量,因此可以使用单个指令读取或写入它们。如果32位变量未对齐,则读取或写入将被分解为多个指令,第二个线程可能会读取损坏的值。
如果我将来迁移到多核系统并且变量在核心之间共享,那么这个问题的答案是否会改变? (假设核心之间有共享缓存)
谢谢!
互斥锁可以保护您免受撕裂 - 例如某些ARM实现使用无序执行,而互斥锁将包含可能对您的算法正确性所必需的内存(和编译器)障碍。
包含互斥锁更安全,然后找出一种方法来优化它,如果它显示为性能问题。
另请注意,如果您的编译器是基于GCC的,那么您可以访问 GCC原子内置。
如果所有的写入都是从一个线程完成的(即其他线程只是读取),那么你不需要互斥锁。如果有多个线程 可能 写作,然后你做。
你不需要互斥。 在32位ARM上,单次写入或读取是原子操作。 (无论核心数量) 当然,您应该将该变量声明为volatile。
在32位系统上,32位变量的读写是原子的。但是,这取决于你对变量做了什么。例如。如果你以某种方式操纵它(例如添加一个值),那么这需要读取,操作和写入。如果CPU和编译器不支持此操作的原子操作,则需要使用互斥锁来保护此多操作序列。
还有其他无锁技术可以减少对互斥锁的需求。