我正在编写一些具有全局数组的代码,该数组可以被两个线程访问以实现读写目的。
不会有读取或写入一系列索引的批处理,所以我正在尝试确定是否应该锁定整个数组,还是只锁定当前使用的数组索引。
最简单的解决方案是将数组视为CS,并在其周围放置一个大的大锁,但我是否可以避免这种情况,只锁定一个索引?
干杯。
发布于 2013-02-18 03:55:45
锁定一个索引意味着您可以跟踪哪个线程正在访问数组的哪一部分。跟踪这个在读线程和写线程之间共享的信息,意味着您对这个信息有一个锁。所以,你最终还是得到了一个全局锁。在这种情况下,我认为最有效的方法是:-使用读取器/写入器锁-或者将大型数组划分为几个子集,每个子集使用不同的锁。
发布于 2013-02-18 03:56:06
如果这是C++,我建议你使用STL容器。std::vector或者其他适合你工作的东西。它们速度快,使用方便,没有内存泄漏。
如果你想自己做所有的事情,那么当然有一种方法是使用单个互斥锁(这是不好的)。或者,您可以对整个数组使用一些reader writer thingy。
我认为用自己的锁使数组线程的每个元素都安全是不可行的!那会吞噬你的记忆。检查链接,有3个不同输出的解决方案。对它们进行测试,并为您的情况使用最好的。(不要认为“好吧,我认为我的程序需要读者偏好算法”。试着在你的系统中使用它并决定。因为我们有时真的不能假设这样的事情)
发布于 2013-02-18 04:01:10
除非您在实际的运行条件下进行分析,否则没有办法知道什么是最优的。我建议实现一个类似数组的类,其中您可以将不同数量的元素锁定在组中。然后微调这些组的大小。
另一种选择是使用active object将所有读/写操作入队。这将使所有访问都是顺序的,这意味着您可以使用非并发数组类型来存储数据。这将需要在幕后使用某种并发队列数据结构。
https://stackoverflow.com/questions/14925294
复制相似问题