我有N个元素需要相互比较才能创建图表。它总共给出(N * N-1)/ 2 比较。
我想多线程那些比较我也有几个限制:
每个元素都很大,实际上它是一个矩阵,因此复制每个线程中的所有元素会占用太多内存。
每次比较都应该发生,这意味着我不能跳过一次。
每次可以在列表中添加新元素时,这非常棘手,因为我需要跟踪已经完成的工作,只做新工具。
由于比较的数量可能很大,比如2000万,我的队列也不大。
最后,我可以随时停止这个过程,我必须能够恢复我在应用程序的其他执行中的位置。
到目前为止,我有一个主线程,其中包含线程池中的所有元素和几个worker。工作线程比较对列表或一系列元素。我想到了一个比较生成器,可以按需提供下一个X比较。
我该如何构建这个生成器?
我应该为工作人员复制每一对,直接从工作人员使用ReadWriteLock来读取Master中的数据吗?
我如何跟踪每个帖子的进度?
我怎样才能停止并恢复比较状态?
如果这是很多问题,我很抱歉。 谢谢!
答案 0 :(得分:0)
假设读取是线程安全的(通常只要没有人编写),一个简单的解决方案是以某种方式在工作线程集中细分任务,事先这样做。例如,对于 n worker,您可以将pair( x , y )分配给worker x mod 名词的。唯一的沟通是让每个工人知道它的序数(0 ... n -1)。每个线程都应该将其答案放入一个私有数组中,这可以在其他人完成后进行整理。
适应不同工人生产率的更复杂的模型是将每个值0 ... N -1推送到队列中。每个工作线程从队列中提取一个数字 x ,评估每个( x , y )对,然后返回另一个< EM> X
如果你想花时间,那么排队对就更有效率,以便最大限度地减少缓存抖动。这是一个棘手的问题。实际上,您希望从小的元素集群中排列对,以便在大致相同的时间对集群中的每个对进行评估。虽然这很棘手,但它可能会对算法的效率产生巨大影响。