繁体   English   中英

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

[英]Should I mutex lock a single variable?

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

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

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

谢谢!

互斥锁不仅可以保护您免受撕裂 - 例如,某些 ARM 实现使用乱序执行,互斥锁将包括 memory(和编译器)屏障,这可能是您的算法正确性所必需的。

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

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

如果所有写入都是从一个线程完成的(即其他线程只在读取),那么不,您不需要互斥锁。 如果可能有多个线程正在写入,那么您会这样做。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM