C++ C/C++;带线程的数组-我需要使用互斥锁还是锁?
我不熟悉使用线程,并且读过很多关于如何共享和保护数据的书。但我也没有真正掌握如何使用互斥锁和锁来保护数据 下面是我将要解决的问题的描述。需要注意的重要一点是,这将是时间关键的,因此我需要尽可能减少开销 我有两个固定大小的双数组C++ C/C++;带线程的数组-我需要使用互斥锁还是锁?,c++,c,arrays,multithreading,mutex,C++,C,Arrays,Multithreading,Mutex,我不熟悉使用线程,并且读过很多关于如何共享和保护数据的书。但我也没有真正掌握如何使用互斥锁和锁来保护数据 下面是我将要解决的问题的描述。需要注意的重要一点是,这将是时间关键的,因此我需要尽可能减少开销 我有两个固定大小的双数组 第一个数组将为后续计算提供数据。 线程将从中读取值,但它永远不会被修改。任何线程都可以在某个时间读取元素 第二个数组将用于存储线程执行的计算结果。此数组的一个元素将仅由一个线程更新,并且可能仅在结果值为时更新一次 这是写给它的 我的问题是: 每次从只读阵列访问数据
- 第一个数组将为后续计算提供数据。 线程将从中读取值,但它永远不会被修改。任何线程都可以在某个时间读取元素
- 第二个数组将用于存储线程执行的计算结果。此数组的一个元素将仅由一个线程更新,并且可能仅在结果值为
时更新一次 这是写给它的
正如Arvid所指出的,您可以使用c++11中引入的关键字请求特定的对齐。在c++11之前,您可以求助于特定于编译器的扩展:在给定的两个条件下,不需要互斥。请记住,每次使用互斥锁(或任何同步构造)都会带来性能开销。因此,您希望尽可能避免使用它们(当然,不影响正确的代码)
你在正确的轨道上 1) 对于第一个数组(只读),不需要为其使用互斥锁。由于线程只是读取而不是更改数据,因此一个线程不可能损坏另一个线程的数据 2) 这个问题让我有点困惑。如果您知道线程1只将一个元素写入阵列插槽1,线程2只将一个元素写入阵列插槽2,那么您就不需要互斥锁。然而,我不确定你是如何实现这个属性的。如果我的上述声明不适合您的情况,您肯定需要一个互斥锁 3) 鉴于原子的定义: 原子类型是封装一个值的类型,该值的访问保证不会导致数据争用,并可用于同步不同线程之间的内存访问 注意,互斥锁是原子锁,这意味着只需要一条汇编指令就可以获取/释放锁。如果需要2个装配说明来抓取/释放锁,则锁不是螺纹安全的。例如,如果线程1试图获取锁并切换到线程2,那么线程2将获取锁 使用原子数据类型会减少开销,但不会显著降低 4) 我不知道你怎样才能保证你的变量是线性的。因为线程可以在程序中随时切换(操作系统决定线程切换的时间)
希望这有帮助您唯一需要使用锁的时间是在共享资源上修改数据时。如