c# - 什么时候分配一个新线程?

标签 c# multithreading performance

<分区>

什么时候应该为任务分配一个新线程?

我的一项任务是计算 100k 个方程并将结果存储到一个数组中,第二项任务是对其进行排序。考虑到我将其设为线程安全代码,我应该坚持使用 2 个线程,还是可以分配 3 个线程来计算 100k 方程式中的三分之一,第四个线程来处理排序?或者只有 2 个线程?

此外,我有一个 4 核处理器,如果我将具有 4 个线程的程序带到另一台具有 2 个核的电脑上会怎样?

谢谢!

最佳答案

首先,为您描述的两个任务(计算和排序)设置两个线程是没有用的,因为您只能在完成所有计算后对结果进行排序,假设您想按结果排序。

对于计算本身,取决于计算的权重。线程允许您同时执行它们,但您也有一点开销。在一个核心上拥有多个线程比只有一个线程要慢,因为您有在线程之间切换的开销,而没有同时执行的好处。

此外,您将需要数组(或列表)的线程安全版本,这可能会慢一点,因为它可能会同步对它的访问。

所以我认为更好的解决方案是每个线程将结果存储在一个数组中,让线程独立计算,只有在它们全部完成后才合并数组。我必须承认我不知道是否可以将单个线程分配给单个内核。如果是这样,我会为每个核心创建一个线程。

在线程之间划分计算时,不要将数组分成 N 等份。可能是您的一个内核正忙于处理来自另一个进程的要求苛刻的线程。如果是这种情况,那么您的进程的线程将几乎没有时间。所以最好分配小块,这样如果一个线程比较慢,它只会计算较少的源数组 block 。如果您使用线程安全计数器,则每个线程都可以在每次计算后选择下一个项目。

关于c# - 什么时候分配一个新线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23139176/

相关文章:

c# - LINQ to SQL - 连接、分组和求和

java - JVM按顺序启动线程的run()方法的保证是什么

mysql - 科哈纳。每个 ORM 调用都是一个数据库查询?

Swift:私有(private)/文件私有(private)运行时性能

java - Swing 在作业运行时更新 UI 组件

javascript - 在 dom 中搜索元素最快的方法是什么?

c# - 如何隐藏 DataGridView 中的任何或所有列标题?

c# - 在 SubmitChanges() 之前验证 Linq2Sql

c# - linq 到 xml。读。并分配给 ViewData..noob

c# - 测试 C# MySQL 连接池失败并出现异常 : Connection must be valid and open