【发布时间】:2015-08-25 20:13:09
【问题描述】:
我是使用线程的新手,并且已经阅读了很多关于如何共享和保护数据的内容。但是我也没有真正掌握使用互斥锁和锁来保护数据。
下面是我将要解决的问题的描述。需要注意的重要一点是时间紧迫,因此我需要尽可能减少开销。
我有两个固定大小的双精度数组。
-
第一个数组将为后续计算提供数据。 线程将从它读取值,但它永远不会被修改。任何线程都可能在某个时间读取一个元素。
-
第二个数组将用于存储线程执行的计算结果。这个数组的一个元素只会被一个线程更新,并且可能只会在结果值时更新一次
写给它。
那么我的问题:
-
每次访问只读数组中的数据时,我真的需要在线程中使用互斥锁吗?如果有,您能解释一下原因吗?
-
当线程写入结果数组时,我是否需要在线程中使用互斥锁,即使这将是唯一写入此元素的线程?
-
我应该使用原子数据类型吗?如果我这样做会不会有任何显着的时间开销?
-
此类问题的许多答案似乎是 - 不,如果您的变量是对齐的,则您不需要互斥锁。我在这个例子中的数组元素会对齐,还是有什么方法可以确保它们对齐?
代码将在 64 位 Linux 上实现。我正计划使用 Boost 库进行多线程处理。
几天来,我一直在考虑这个问题并在整个网络上查看,一旦发布,答案和清晰的解释就会在几秒钟内返回。有一个“公认的答案”,但所有答案和 cmets 都同样有帮助。
【问题讨论】:
-
锁的目的是防止一个并发任务在另一个任务正在使用它的同时修改数据。对于输入数组,数据是不可变的(没有线程修改它),所以你不需要锁定它。
-
如果你确实在你的描述中持有这些谓词,我认为不需要任何锁或原子。
-
至于问题 4:您的数组(显然)需要对齐以满足其类型,并且默认情况下是对齐的。但是,您可能还想额外对齐缓存行(通常为 64 字节),并且您可能真的想避免错误共享:en.wikipedia.org/wiki/False_sharing
标签: c++ c arrays multithreading mutex