我应该何时为该任务分配新线程?
我有一个任务来计算100k方程并将结果存储到一个数组中,第二个任务用于对它进行排序。我应该坚持2个线程,考虑到我使它成为一个线程安全的代码,或者我可以分配3个线程来计算100k方程的三分之一和第四个来处理排序?或者只是2个线程?
另外,我有一个4核处理器,如果我将带有4个线程的程序带到另一台带有2个内核的PC上,会发生什么?
谢谢!
答案 0 :(得分:5)
首先,为你描述的两个任务(计算和排序)设置两个线程是没用的,因为你只能在完成所有计算后对结果进行排序,假设你想按结果排序。
对于计算本身,它取决于计算的权重。线程允许您同时执行它们,但您也有一点开销。在一个核心上有多个线程比只有一个线程慢,因为你得到了在线程之间切换的开销,而没有同时执行的好处。
此外,您将需要一个线程安全版本的数组(或列表),这可能会慢一点,因为它可能会同步访问它。
所以我认为更好的解决方案是将结果存储在每个线程的一个数组中,让线程独立计算,并且只有在它们全部完成后才能组合数组。我必须承认我不知道你是否可以将单个线程分配给单个核心。如果是这样,我会为每个核心创建一个线程。
在线程之间划分计算时,不要将数组切成N个相等的块。可能是你的一个内核非常忙于来自另一个进程的严格线程。如果是这种情况,那么您的流程的一个主题几乎不会得到任何时间。因此最好分配小块,因此如果线程较慢,它将只计算较少的源数组。如果使用线程安全计数器,每个线程只能在每次计算后选择下一个项目。