c/c++语言开发共享带线程的C / C ++数组 – 我需要使用互斥锁还是锁?

我是使用线程的新手,并且已经阅读了很多关于如何共享数据和保护数据的信息。 但是我还没有真正掌握何时需要使用互斥锁和锁来保护数据。

以下是我将要解决的问题的描述。 需要注意的重要一点是它对时间至关重要,因此我需要尽可能减少开销。

我有两个固定大小的双arrays。

我的问题呢?

代码将在64位linux上实现。 我打算使用Boost库进行multithreading处理。

感谢所有的回复和评论,我一直在仔细研究这个问题并在网上看了好几天,并且一旦发布了答案,并且在几秒钟之内就会有明确的解释。 有一个“已接受的答案”,但所有答案和评论都同样有用。 再次感谢

    在给出的两个条件下,不需要互斥量。 请记住, 每次使用互斥锁(或任何同步构造)都是性能开销。 因此,您希望尽可能地避免使用它们(当然,不要妥协正确的代码)。

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

    要看。

    在任何情况下,请注意不要通过不同的线程写入相邻的存储器位置。 这可能会破坏性能。 请参阅“虚假共享”。 考虑到,你可能没有很多内核,因此没有很multithreading,你说写只做了一次,但这可能不会成为一个重大问题。

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

    鉴于您在评论中对您的情况的描述,似乎根本不需要同步,因此没有primefaces和锁。

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

    您需要使用锁定的唯一时间是在共享资源上修改数据。 例如,如果某些线程用于写入数据而某些线程用于读取数据(在两种情况下都来自同一资源),那么在写入完成时只需要锁定。 这是为了防止被称为“种族”的事情。

    当您制作操作共享资源上的数据的程序时,谷歌上有很好的竞赛信息。

    你走在正确的轨道上。

    1)对于第一个arrays(只读),您不需要使用互斥锁。 由于线程只是读取不改变数据,因此线程无法破坏另一个线程的数据

    2)我对这个问题有点困惑。 如果您知道线程1只会将一个元素写入数组插槽1,而线程2只会写入数组插槽2,那么您不需要互斥锁。 但是我不确定你是如何实现这个属性的。 如果我的上述陈述对您的情况不正确,您肯定需要一个互斥锁。

    3)给定primefaces的定义:

    primefaces类型是封装值的类型,该值的访问保证不会导致数据争用,并且可用于同步不同线程之间的内存访问。

    注意,互斥锁是primefaces的意味着只需要一个汇编指令来获取/释放锁。 如果它需要2个汇编指令来获取/释放锁,则锁将不是线程安全的。 例如,如果线程1尝试获取锁并且切换到线程2,则线程2将获取锁。

    使用primefaces数据类型可以减少开销,但不会显着降低。

    4)我不确定你怎么能保证你的变量是排列的。 由于线程可以在程序中的任何时刻切换(您的操作系统确定线程何时切换)

    希望这可以帮助

      以上就是c/c++开发分享带线程的C / C ++数组 – 我需要使用互斥锁还是锁?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/549459.html

      (0)
      上一篇 2021年1月14日
      下一篇 2021年1月14日

      精彩推荐