Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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# 多线程-5个还是100个线程?_C#_Multithreading_Thread Safety - Fatal编程技术网

C# 多线程-5个还是100个线程?

C# 多线程-5个还是100个线程?,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,我有一个双核处理器,现在让我们假设我想做一个垃圾机器人程序,它将垃圾信息,如嘿,你好吗 我的问题是,有多少线程能够以最快的速度弹出这些消息,运行5个线程或100个线程对消息进行僵尸处理?当然,这些数字并不特别,只是举个例子。所有线程都将在线程安全模式下运行 编辑:至于之前的反对票,我并不是在写spambot程序,我只是把它作为我的问题的一个例子,很抱歉误解了,理想的线程数取决于你的硬件,在这种情况下是双核处理器,以及这些线程在做什么。如果它们是CPU密集型的,那么每个内核超过1个线程可能会降低速

我有一个双核处理器,现在让我们假设我想做一个垃圾机器人程序,它将垃圾信息,如嘿,你好吗

我的问题是,有多少线程能够以最快的速度弹出这些消息,运行5个线程或100个线程对消息进行僵尸处理?当然,这些数字并不特别,只是举个例子。所有线程都将在线程安全模式下运行


编辑:至于之前的反对票,我并不是在写spambot程序,我只是把它作为我的问题的一个例子,很抱歉误解了,理想的线程数取决于你的硬件,在这种情况下是双核处理器,以及这些线程在做什么。如果它们是CPU密集型的,那么每个内核超过1个线程可能会降低速度

如果线程执行一些IO,那么通过添加线程,您将看到性能的总体提高。收益递减点完全取决于非CPU任务的性质和特定的硬件

要找到这一点,您必须测试各种线程总数


您可以将系统设计为自调整正在使用的线程数。我曾经设计过一个系统,当总CPU负载约为70%时,它的总吞吐量最高。为了优化这个值,我在线程之间添加了一个延迟线程,直到CPU达到70%,+/-5%。如果超过80%,我会通知一个或多个线程完成当前的工作并终止。如果低于60%,我会逐渐添加线程。工作起来很有魅力。

理想的线程数量取决于您的硬件(在本例中为双核处理器)以及这些线程的功能。如果它们是CPU密集型的,那么每个内核超过1个线程可能会降低速度

如果线程执行一些IO,那么通过添加线程,您将看到性能的总体提高。收益递减点完全取决于非CPU任务的性质和特定的硬件

要找到这一点,您必须测试各种线程总数


您可以将系统设计为自调整正在使用的线程数。我曾经设计过一个系统,当总CPU负载约为70%时,它的总吞吐量最高。为了优化这个值,我在线程之间添加了一个延迟线程,直到CPU达到70%,+/-5%。如果超过80%,我会通知一个或多个线程完成当前的工作并终止。如果低于60%,我会逐渐添加线程。工作起来很有魅力。

故意创建比处理器更多的线程是一种标准技术,用于通过为处理器提供一些其他有用的工作来利用空闲周期,在空闲周期中,线程被阻止等待某个东西,无论是I/O、互斥还是其他东西

如果您的线程正在执行I/O,那么这是提高速度的有力竞争者:当每个线程阻塞等待I/O时,处理器可以运行其他线程,直到它们也阻塞I/O,希望到那时第一个线程的数据准备就绪,依此类推


来源:

故意创建比处理器更多的线程是一种标准技术,用于通过为处理器提供一些其他有用的工作来利用空闲周期,在空闲周期中,线程被阻塞以等待某些事情,无论是I/O、互斥还是其他事情

如果您的线程正在执行I/O,那么这是提高速度的有力竞争者:当每个线程阻塞等待I/O时,处理器可以运行其他线程,直到它们也阻塞I/O,希望到那时第一个线程的数据准备就绪,依此类推


来源:

@idish:我知道你不是在做垃圾机器人,但我投了反对票,因为不清楚你在问什么。线程与弹出消息有什么关系?如果你只是想尽可能快地弹出它们,想知道有多少个线程可以在它们互相阻塞之前最快地完成这项任务,那是一回事,但事实上,这个问题的措辞非常不清楚。@MooingDuck你是对的,我很难恰当地描述我的问题,但事实上,这是正确的描述:尽可能快地弹出它们,并想知道有多少线程可以在它们互相阻塞之前最快地完成这些任务@MooingDuck:我不认为我的答案是无用的:-@MooingDuck他的答案一点也不无用,他帮助我理解了我不知道的事情。@EricJ。很好的一点,您的答案实际上是关于多线程的足够通用的,所以它不是无用的。干得好@伊迪什:我知道你不是在做垃圾机器人,但我投了反对票,因为不清楚你在问什么。线程与弹出消息有什么关系?如果你只是想尽可能快地弹出它们,想知道有多少线程可以在它们互相阻塞之前最快地完成这项任务,那是一回事,但事实上,这个问题的措辞非常不清楚。@MooingDuck你是对的,我很难描述m

这是一个正确的问题,但实际上这是正确的描述:尽可能快地弹出它们,并想知道在它们互相阻塞之前,有多少线程可以最快地完成这些任务@MooingDuck:我不认为我的答案是无用的:-@MooingDuck他的答案一点也不无用,他帮助我理解了我不知道的事情。@EricJ。很好的一点,您的答案实际上是关于多线程的足够通用的,所以它不是无用的。干得好是的,但是如果那些额外的线程也只执行IO,您将不会得到任何加速。您可能会减慢程序速度…这取决于I/O。对于高延迟网络连接,大量线程肯定会提供很大的加速。在线程数量变得异常庞大之前,实际上很难真正降低一个典型程序的速度。是的,但是如果这些额外的线程也只执行IO,那么就不会得到任何加速。您可能会减慢程序速度…这取决于I/O。对于高延迟网络连接,大量线程肯定会提供很大的加速。在线程数量变得异常庞大之前,实际上很难真正降低典型程序的速度。感谢您的详细回答,并支持我的问题^^。我不确定你是否获得了任何分数,因为问题已经结束了,但无论如何我都会接受你的回答,非常感谢。好吧,到目前为止,这个问题几乎重新开始了,5张必选票中的4张。已结束的问题将获得分数,但已删除的问题不会获得分数。无论如何,这是关于帮助人们的。我过去的想法是从一个线程开始,每秒增加一个线程,直到吞吐量降低,然后删除一个线程。然后每隔一段时间,我随机添加或删除一个线程,如果吞吐量降低,则撤销该线程。类似的概念。@idish:它是一个计费平台。工作单元是从一个扁平的Oracle表中提取一批包含数千条记录的数据,并对该批数据执行相当CPU密集的工作—应用大量业务规则来识别可计费事件。每个工作单元的开始拉取记录和结束写入计费事件都有IO。+1。旁注:在不受CPU限制的情况下,切换到使用适当的异步调用将得到更好的结果,这可能会得到比使用多线程更好的结果。如果在资源使用率足够高的情况下,像Eric J的情况一样,自定义线程池可能是一个很好的选择,在此之前考虑使用标准线程池。谢谢您的详细解答,并支持我的问题^ ^ ^。我不确定你是否获得了任何分数,因为问题已经结束了,但无论如何我都会接受你的回答,非常感谢。好吧,到目前为止,这个问题几乎重新开始了,5张必选票中的4张。已结束的问题将获得分数,但已删除的问题不会获得分数。无论如何,这是关于帮助人们的。我过去的想法是从一个线程开始,每秒增加一个线程,直到吞吐量降低,然后删除一个线程。然后每隔一段时间,我随机添加或删除一个线程,如果吞吐量降低,则撤销该线程。类似的概念。@idish:它是一个计费平台。工作单元是从一个扁平的Oracle表中提取一批包含数千条记录的数据,并对该批数据执行相当CPU密集的工作—应用大量业务规则来识别可计费事件。每个工作单元的开始拉取记录和结束写入计费事件都有IO。+1。旁注:在不受CPU限制的情况下,切换到使用适当的异步调用将得到更好的结果,这可能会得到比使用多线程更好的结果。如果在资源使用率足够高的情况下,像Eric J的情况一样,定制线程池可能是一个很好的选择,在此之前考虑使用标准线程池。