.net - 多线程: At what point have you created too many threads?

标签 .net multithreading

我正在开发多线程应用程序。

该应用程序从一个线程开始,然后扩展到多个线程以实现性能提升。

我有一个主线程,它将工作分成较小的块,并将其卸载到处理这些块的工作线程中。使用信号量控制此部分,以在任何一次仅允许X个工作线程。工作线程生成数据块,然后将数据块存储在队列或环形缓冲区中,然后由一个保存线程读取。该线程负责将数据块保存到磁盘(有时跨本地网络)。

我的开发机器是具有8GB RAM的四核。在具有3个工作程序线程和1个保护程序线程的计算机上运行应用程序将导致网络上稳定的数据流,而处理器的平均利用率为75%。

解决该问题的第二种方法是在工作线程和保护线程之间添加另一组线程(即,从当前工作线程中取出一个任务,然后将其添加到另一个线程中)(我还要为每个线程添加一个队列这些线程),因为资源RAM总线饱和和处理器争用似乎有太多争用,因此应用程序似乎在我的机器上没有获得任何速度。

通过对线程数量及其优先级的大量试验,我找到了解决该问题的第一种和第二种方法的理想设置。现在,生产机器将具有8核和64GB RAM。完全不同的环境和应用程序必须为其配置。

我的问题是,什么时候创建了太多线程?确定给定机器的理想设置是否总是试验的问题?是否有确定或观察锁定是否从应用程序中移走太多的方法?

(我不使用线程池,因为它不能满足我的需要,因为长时间运行的线程是由信号灯和其他锁定机制管理的。)

最佳答案

当应用程序的整体性能下降或对该盒上运行的其他应用程序的影响受到不利影响到无法接受的程度时,您创建了太多线程。

关键是没有绝对的答案。

我正在处理的一个应用程序使用1000个线程的线程池,对于我们正在执行的操作,这似乎是正确的数字。在一种配置中,我们没有限制它,它上升到30,000+,基本上使机器停顿了下来。

基本上,您必须对其进行性能测试,并具有足够的监视/工具来确定应用程序的整体吞吐量,资源使用率,线程利用率,并知道空闲线程的状态以及等待队列等待的时间。然后,您可以根据需要进行调整。

注意事项:在添加另一层线程之前,请仔细考虑。如您所知,编写多线程代码很困难。尝试使其尽可能简单。添加另一层是一个冒险的步骤。

关于.net - 多线程: At what point have you created too many threads?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1285774/

相关文章:

c# - 如何获取当前 .exe 的哈希值?

c# - 两个左尖括号 "<<"在 C# 中是什么意思?

c# - NET 3.5 中 Monitor.TryEnter 的替代方案

c++ - 结合多线程 C++ 和 Unity

c# - 如何从 C# 代码与命令提示符进行交互?

php - 在 PHP 5.6.12 中启用 DOTNET COM 扩展

c# - 更新到 .net core 2.1 后有很多波浪线 - 'may need to supply run time policy'

ios - 无法访问 dispatch_async : "Variable is not Assignable (missing _block type specifier)" 中的全局变量

java - 无法创建新的 native 线程

Python:服务多个用户的最佳方式?