Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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++处理流数据时遇到了问题。数据以条目形式出现,每个条目的大小相对较小,处理每个条目的任务不需要太多时间。但是,每个条目以及任务的处理都被分配给类A概念,而不是C++类,其中只有一个属于同一类的任务可以同时执行。p>_C++_Multithreading_Parallel Processing - Fatal编程技术网

一组互斥任务的线程级并行性 我在用C++处理流数据时遇到了问题。数据以条目形式出现,每个条目的大小相对较小,处理每个条目的任务不需要太多时间。但是,每个条目以及任务的处理都被分配给类A概念,而不是C++类,其中只有一个属于同一类的任务可以同时执行。p>

一组互斥任务的线程级并行性 我在用C++处理流数据时遇到了问题。数据以条目形式出现,每个条目的大小相对较小,处理每个条目的任务不需要太多时间。但是,每个条目以及任务的处理都被分配给类A概念,而不是C++类,其中只有一个属于同一类的任务可以同时执行。p>,c++,multithreading,parallel-processing,C++,Multithreading,Parallel Processing,此外,有几十亿个条目和一千万个类,条目以随机类的形式出现 我发现很难将这些任务并行化。任何关于如何加快进程的建议都将大有帮助 真的谢谢 将工作条目放入一组特定于类的工作队列中。使用队列大小作为优先级,较大的队列大小优先于较小的队列大小。设置一组队列,以根据其大小将特定于类的工作队列作为优先级保存 如果没有人处理该队列,则将工作条目输入到相应的队列中 设置一个线程池,其大小与您拥有的CPU数量大致相同 每个线程都向优先级队列请求最高优先级的工作队列,该队列可以说是包含最多工作的队列。线程从优先级队

此外,有几十亿个条目和一千万个类,条目以随机类的形式出现

我发现很难将这些任务并行化。任何关于如何加快进程的建议都将大有帮助


真的谢谢

将工作条目放入一组特定于类的工作队列中。使用队列大小作为优先级,较大的队列大小优先于较小的队列大小。设置一组队列,以根据其大小将特定于类的工作队列作为优先级保存

如果没有人处理该队列,则将工作条目输入到相应的队列中

设置一个线程池,其大小与您拥有的CPU数量大致相同

每个线程都向优先级队列请求最高优先级的工作队列,该队列可以说是包含最多工作的队列。线程从优先级队列中删除类队列。然后,它处理该队列中的所有元素,而不锁定它;这使得每单位的开销很小


如果同时出现该类的新成员,则会将其添加到该类的新队列中,但不会放置在优先级队列中。当使用完当前队列时,工作线程将检查是否存在同一类的新队列,并处理该队列(如果存在)

假设CPU至少在某种程度上参与,那么每个硬件处理器大约需要一个任务处理器

每个处理器锁定一组活动类,从队列的前端挤出一堆作业,在给定当前集合状态的情况下可以运行这些作业,将这些作业标记为集合中正在使用的作业,解锁集合和队列,以及进程

每个slurp有多少个作业取决于作业的速率、处理器的数量以及它们对集群和延迟的敏感程度

饥饿应该是不可能的,因为一旦类可以自由处理,未被引诱的元素应该是高概率的

分批工作以保持集合和队列的低争用:理想情况下,根据争用、空闲和延迟信息动态更改批大小


这使得开销与处理器的数量成正比,而不是与任务类的数量成正比。

这是一个非常复杂的要求。你能提供更多的细节吗?也许我们可以想出一些解决办法。数千万个信号量的数组听起来不太可能:试着拥有一个队列池,每个队列不是非活动的,就是包含一个类的项,每个队列都由自己的线程提供服务。每个条目都是一行SQL表,保证有一列表示用户。因此这里的“类”实际上是一个用户id。数千万个队列?OP有数千万个对象。为什么数以千万计的排队让他烦恼?实际上,如果操作正确,他只需要为有未处理成员的类排队。您可能需要一个包含null的数组或一个指向每个类有一个插槽的队列的指针。这是40Mb。我也尝试过类似的方法,但结果证明,每个处理器都必须有一个任务队列,并且在不可避免地从队列中推送和弹出时锁定。为了缓解这一问题,我设法使用了一个队列,该队列的锁定程度低于原始实现。我把它贴在了。但是,尽管我已经做了这样的优化,尽管使用的处理器数量很多,但它仍然比顺序队列慢。@Tim我不明白为什么给定处理器线程的内部队列需要包含锁定:它只能从线程内部访问。但队列中的条目从何而来?它来自另一个线程,不断读取输入,推送到相应的队列。注意,不能有多个线程同时读取输入和处理不相关的输入,因为输入是用随机类馈送的