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