|
|
1
3
在我看来,这是一种生产者-消费者模式,可以用两个信号量来实现,一个用于保护队列溢出,另一个用于保护空队列。 here . |
|
|
2
3
对
解决这一问题的一种方法是将多个作业捆绑成一个:如果你得到一个“小”作业(不管你如何评估这些东西),将其存储在某个地方,直到你有足够多的小作业组合在一起,形成一个合理大小的作业。然后将它们全部发送到工作线程进行处理。 或者,您可以使用多读单写队列来存储作业,而不是使用信令。在这个模型中,每个工作线程都试图从队列中抓取作业。当它找到一个,它就完成了任务;如果没有,它会短时间睡眠,然后醒来再试一次。这将降低每个任务的开销,但即使没有工作要做,线程也会占用CPU。这完全取决于问题的确切性质。 |
|
|
3
2
注意,在发出结束信号后,您仍在要求下一份工作。
|
|
|
4
2
既然你说是 很 另一方面,如果2500次循环迭代的处理时间大于100微秒(在当前的PC上),则可能会遇到硬件的限制。如果您的处理占用大量内存带宽,那么将其拆分为四个处理器不会为您提供更多带宽,实际上会因为冲突而减少带宽。您还可能会遇到缓存循环问题,在这个问题上,前1000个迭代中的每一个都会刷新并重新加载4个核心的缓存。那么就没有一个解决方案,而且根据您的目标硬件,可能没有。 |
|
|
5
1
可能还有其他问题,getNextJob如何处理其数据?如果有大量的数据复制,那么您的开销又会显著增加。 我会通过让每个线程不断地从队列中提取作业,直到队列为空来优化它。这样,您可以将一百个作业传递给线程池,同步对象将只用于启动线程一次。我还将作业存储在队列中,并将指向它们的指针、引用或迭代器传递给线程,而不是复制数据。 |
|
|
6
1
线程之间的上下文切换也可能很昂贵。在某些情况下,开发一个框架是很有趣的,您可以使用该框架以一个线程或多个线程顺序处理作业。这样你就可以拥有两个世界中最好的一个。 顺便问一下,你的问题到底是什么?我将能够用一个更精确的问题更精确地回答:) 编辑:
您应该查找线程间同步瓶颈。您可以跟踪线程等待时间,以。。。 编辑:经过更多提示。。。 如果我猜对了,你的问题是如何有效地使用你所有的计算机核心/处理器来并行化一些基本上是顺序的处理。 假设您有4个内核和10000个循环要计算,如您的示例(在注释中)。您说过需要等待4个线程结束后才能继续。然后,您可以简化同步过程。你只需要给你的四个线程thr n,n+1,n+2,n+3个循环,等待这四个线程完成,然后继续。您应该使用集合或屏障(等待n个线程完成的同步机制)。 Boost |
|
|
7
1
“昂贵”是一个相对的术语。飞机贵吗?是汽车吗?或者自行车。。。鞋 在这种情况下,问题是:相对于JobFunction执行所花费的时间,事件是否“昂贵”?这将有助于公布一些绝对数字:进程“无线程”时需要多长时间?是几个月,还是几飞秒? 随着线程池大小的增加,时间会发生什么变化?尝试将池大小设置为1、2、4,以此类推。 另外,由于您过去在这里遇到了一些线程池问题,我建议您进行一些调试 要计算实际调用threadfunction的次数。。。它符合你的期望吗?
|
|
|
8
1
如果您只是在并行循环并使用VS2008,我建议您看看OpenMP。如果您使用的是visual studio 2010 beta 1,我建议您查看 parallel pattern library ,尤其是 "parallel for" / "parallel for each" apis 或者 "task group 类,因为它们很可能会执行您试图执行的操作,只需要更少的代码。
我建议你在一个像 xperf visual studio 2010 beta 1中的f1探查器(它有两种新的并发模式,有助于查看争用)或Intel的vtune。 您还可以共享您在任务中运行的代码,这样人们就可以更好地了解您在做什么,因为对于性能问题,我总是得到的答案是第一个“这取决于”第二个“您是否分析了它” 祝你好运 -瑞克 |
|
|
9
0
如前所述,线程增加的开销取决于执行您定义的“作业”所花费的相对时间。因此,在工作块的大小上找到一个平衡点是很重要的,它可以最大限度地减少块的数量,但不会让处理器空闲等待最后一组计算完成。
|
|
OREO · 如何在不实际单击复选框的情况下选中它 1 年前 |
|
|
Dan · 在元素外部设置html点击处理程序点击后立即触发 2 年前 |
|
|
Mero · Svelte在父事件调用上调用新的嵌套事件处理程序 2 年前 |
|
|
iorice · usercontrol dll中的组件事件 2 年前 |
|
|
Awin · 点击事件功能不适用于Vue组件 2 年前 |
|
|
Kiwi · 将可共享的自定义数据添加到事件MS图形api 2 年前 |