Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多线程暴力强制元素之间的比较以创建图形_C++_Multithreading_Algorithm_Graph Algorithm - Fatal编程技术网

C++ 多线程暴力强制元素之间的比较以创建图形

C++ 多线程暴力强制元素之间的比较以创建图形,c++,multithreading,algorithm,graph-algorithm,C++,Multithreading,Algorithm,Graph Algorithm,我有N个元素,它们需要相互比较以创建一个图表。它总共提供了(N*N-1)/2比较 我想多线程进行这些比较我还有几个限制: 每个元素都相当大,实际上它是一个矩阵,所以复制每个线程中的所有元素会占用太多内存 每次比较都应该进行,这意味着我不能跳过一次 每次可以在列表中添加一个新元素时,这是非常棘手的,因为我需要跟踪已经完成的工作,只做新的工作 由于比较的数量可能很大,比如2000万,我不能有这么大的队列 最后,任何时候都可以停止这个过程,我必须能够在应用程序的其他执行过程中恢复 到目前为止,我有

我有N个元素,它们需要相互比较以创建一个图表。它总共提供了(N*N-1)/2比较

我想多线程进行这些比较我还有几个限制:

  • 每个元素都相当大,实际上它是一个矩阵,所以复制每个线程中的所有元素会占用太多内存

  • 每次比较都应该进行,这意味着我不能跳过一次

  • 每次可以在列表中添加一个新元素时,这是非常棘手的,因为我需要跟踪已经完成的工作,只做新的工作

  • 由于比较的数量可能很大,比如2000万,我不能有这么大的队列

  • 最后,任何时候都可以停止这个过程,我必须能够在应用程序的其他执行过程中恢复

到目前为止,我有一个主线程,它包含线程池中的所有元素和几个工作线程。工作线程比较一组对或一系列元素。我想到了一个比较生成器,它根据需要提供下一个X比较

我怎样才能建造这个发电机

我是否应该为worker复制每一对,直接从worker使用ReadWriteLock从Master读取数据

如何跟踪每个线程的进度

我如何停止并恢复比较状态

如果有很多问题,我很抱歉。
谢谢大家!

假设读取是线程安全的(通常只要没有人在写),一个简单的解决方案是以某种方式在工作线程集中细分任务,提前这样做。例如,对于n个worker,您可以将对(x,y)分配给worker x mod n。唯一的沟通是让每个工人知道其序号(0…n-1)。每个线程都应该将其答案放入一个私有数组中,在其他所有线程完成后可以对其进行整理

适应不同工人生产率的更复杂模型是将每个值0…N-1推送到队列中。每个工作线程从队列中提取一个数字x,计算每个(x,y)对,然后返回另一个x


如果您想花点时间,将对排队以最小化缓存抖动会更有效。这是一个棘手的问题。本质上,您希望将元素的小集群中的对排队,以便在几乎相同的时间对集群中的每一对进行求值。尽管这很棘手,但它可能会对算法的效率产生巨大的影响。

可以进一步解释缓存抖动问题吗?正如我所说,我的读取不是线程安全的,因为我可以随时添加元素,所以我有一个readwritelock来保护我的N个元素。在您的模型中,您没有说明如果有新元素,如何停止和恢复。例如,@Kikohs:WRT cache,您可能会遇到的问题是,许多线程访问许多不同的内存区域时,会因为二级缓存的使用而相互争斗。就线程访问的内存而言,将线程保持在一起可以缓解这种情况,有时会对性能产生显著影响。例如,六个线程评估对集{0/1、0/2、0/3、1/2、1/3、2/3}的执行效率可能比评估{0/1、2/3、4/5、6/7、8/9、10/11}的执行效率更高。@Kikohs:Wrt线程安全性取决于列表中元素的管理方式。如果它们从未被移动(例如,链表或deque)或删除,则可以将迭代器或指针对排队。当新元素到达时,主线程将包含新元素的一组新指针对排入队列。