multithreading – 在arrays中我应该保护什么?

我正在研究一些具有全局数组的代码,可以通过两个线程访问这些代码来读写。

没有批处理会读取或写入一系列索引,所以我试图弄清楚我是应该锁定整个数组还是只锁定我当前正在使用的数组索引。

最简单的解决方案是将数组视为一个CS并对其进行大量锁定,但是我可以避免这种情况并锁定索引吗?

干杯。

锁定一个索引意味着您可以跟踪哪个线程正在访问arrays的哪个部分。 跟踪读取和写入线程之间共享的此信息意味着您可以锁定此信息。 所以,你仍然最终得到了全局锁定。 在这种情况下,我认为最有效的方法是: – 使用读取器/写入器锁定 – 或将大数组划分为几个子集,每个子​​集使用不同的锁定。

如果这是C ++我建议您使用STL容器。 std::vector或其他适合你工作的东西。 它们快速,易于使用,无内存泄漏。

如果你想通过自己完成所有这些,那么当然一种方法是使用一个互斥(这是坏的)。 或者你可以使用一些读者写作东西为整个数组。

我认为使用自己的锁来使数组线程的每个元素都安全是不可行的! 这会吃掉你的记忆。 检查链接,有3种不同的解决方案。 测试它们并使用最适合您的情况。 (不要认为“好吧我认为我的程序需要读者偏好算法”。尝试在你的系统中使用它并决定。因为我们真的不能假设这样的事情)

除非您在真实的运行条件下进行分析,否则无法知道什么是最佳的。 我建议实现一个类似数组的类,你可以在组中锁定不同数量的元素。 然后你微调这些组的大小。

另一种选择是使用活动对象将所有读/写操作排入队列。 这将使所有访问顺序,并且意味着您可以使用非并发数组类型来存储数据。 它需要某种并发队列数据结构。