我正在研究一些具有全局数组的代码,可以通过两个线程访问这些代码来读写目的。
没有批处理会读取或写入一系列索引,所以我试图找出是应该锁定整个数组还是只锁定我当前正在使用的数组索引。
最简单的解决方案是将数组视为CS并对其进行大量锁定,但是我可以避免这种情况并锁定索引吗?
干杯。
答案 0 :(得分:4)
锁定一个索引意味着您可以跟踪哪个线程正在访问阵列的哪个部分。跟踪读取和写入线程之间共享的此信息意味着您可以锁定此信息。所以,你仍然最终得到一个全局锁。 在这种情况下,我认为最有效的方法是: - 使用读写器锁 - 或者将大数组划分为几个子集,每个子集使用不同的锁。
答案 1 :(得分:1)
如果这是C ++我建议您使用STL容器。 std::vector
或其他适合您工作的东西。它们快速,易于使用,没有内存泄漏。
如果你想自己做这一切,那么当然一种方法是使用一个互斥(这是坏的)。 或者你可以为整个数组使用一些reader writer thingy。
我认为使用自己的锁定使数组线程的每个元素都安全是不可行的!这会吃掉你的记忆。检查链接,有3种不同的解决方案。测试它们并使用最适合您的情况。 (不要认为“好吧我认为我的程序需要读者偏好算法”。尝试在你的系统中使用它并决定。因为我们真的不能假设这样的事情有时候)
答案 2 :(得分:1)
除非您在真实的运行条件下进行分析,否则无法知道什么是最佳选择。我建议实现一个类似数组的类,你可以在组中锁定不同数量的元素。然后你微调这些组的大小。
另一种选择是使用active object将所有读/写操作排入队列。这将使所有访问顺序,并且意味着您可以使用非并发数组类型来存储数据。它需要某种并发队列数据结构。