gpt4 book ai didi

c++ - 带线程的 C/C++ 数组——我需要使用互斥锁还是锁?

转载 作者:可可西里 更新时间:2023-11-01 15:56:56 26 4
gpt4 key购买 nike

我刚开始使用线程,并且阅读了很多有关如何共享和保护数据的资料。但我也没有真正掌握如何使用互斥锁和锁来保护数据。

下面是我将要处理的问题的描述。需要注意的重要一点是,这将是时间紧迫的,因此我需要尽可能减少开销。

我有两个固定大小的 double 组。

  • 第一个数组将为后续计算提供数据。线程将从中读取值,但永远不会修改它。某个元素可能会在某个时间被任何线程读取。

  • 第二个数组将用于存储线程执行的计算结果。这个数组的一个元素只会被一个线程更新,并且可能只会在结果值
    时更新一次写给它。

我的问题是:

  1. 每次访问只读数组中的数据时,我真的需要在线程中使用互斥锁吗?如果是这样,您能解释一下原因吗?

  2. 当线程写入结果数组时,我是否需要在线程中使用互斥锁,即使这将是唯一写入此元素的线程?

  3. 我应该使用原子数据类型吗?如果我这样做会不会有任何显着的时间开销?

  4. 许多此类问题的答案似乎是 - 不,如果您的变量已对齐,则不需要互斥量。此示例中的数组元素是否对齐,或者是否有某种方法可以确保它们对齐?

代码将在 64 位 Linux 上实现。我计划将 Boost 库用于多线程。

几天来,我一直在考虑这个问题并在整个网络上寻找,一旦发布,答案和清晰的解释在几秒钟内就回来了。有一个“可接受的答案”,但所有答案和评论都同样有帮助。

最佳答案

  1. Do I really need to use a mutex in a thread each time I access the data from the read-only array? If so could you explain why?

没有。因为数据永远不会被修改,所以不会有同步问题。

  1. Do I need to use a mutex in a thread when it writes to the result array even though this will be the only thread that ever writes to this element?

视情况而定。

  1. 如果任何其他线程要读取该元素,则需要同步。
  2. 如果任何线程可能修改 vector 的大小,则需要同步。

无论如何,注意不要让不同的线程大量写入相邻的内存位置。这可能会破坏性能。参见“虚假共享”。考虑到,您可能没有很多内核,因此没有很多线程,并且您说写入只完成一次,但这可能不会成为一个重大问题。

  1. Should I use atomic data types and will there be any significant time over head if I do?

如果你使用锁(互斥量),原子变量就不是必需的(而且它们确实有开销)。如果不需要同步,则不需要原子变量。如果需要同步,那么在某些情况下可以使用原子变量来避免锁。在哪些情况下你可以使用原子而不是锁......我认为这更复杂并且超出了这个问题的范围。

鉴于您在评论中的情况描述,似乎根本不需要同步,因此也不需要原子或锁。

  1. ...Would my array elements in this example be aligned, or is there some way to ensure they are?

正如 Arvid 所指出的,您可以使用 alginas 请求特定对齐c++11 中引入的关键字。在 c++11 之前,您可以求助于编译器特定的扩展:https://gcc.gnu.org/onlinedocs/gcc-5.1.0/gcc/Variable-Attributes.html

关于c++ - 带线程的 C/C++ 数组——我需要使用互斥锁还是锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30758663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com