【发布时间】:2009-08-17 00:58:59
【问题描述】:
我正在开发一个多线程应用程序。
此应用程序最初是单线程,后来扩展到多线程以实现性能提升。
我有一个主线程,它将工作分成更小的块并将其卸载到处理这些块的工作线程。这部分是使用信号量控制的,以在任何时候只允许 X 数量的工作线程。工作线程产生数据块,然后将其存储在队列或环形缓冲区中,然后由一个保存线程读取。该线程负责将数据块保存到磁盘(有时跨本地网络)。
我的开发机器是具有 8GB RAM 的四核。在我的机器上使用 3 个工作线程和 1 个保护线程运行应用程序会导致网络上稳定的数据流,处理器的平均利用率为 75%。
解决这个问题的第二种方法是在工作线程和保护线程之间添加另一组线程(即从当前工作线程中取出一个任务并将其添加到另一个线程)(我还添加了一个队列对于这些线程中的每一个)应用程序似乎没有在我的机器上获得任何速度,因为似乎对资源 RAM 总线饱和和处理器争用有太多争用。
通过对线程数量及其优先级的大量实验,我找到了适合我的机器的理想设置,无论是解决此问题的第一种方法还是第二种方法。现在生产机器将有 8 个内核和 64GB 的 RAM。必须为它配置一个非常不同的环境和应用程序。
我的问题是,您在什么时候创建了太多线程?确定给定机器的理想设置是否总是一个实验问题?是否有一种方法可以确定或观察锁定是否占用了应用程序太多的时间?
(我没有使用线程池,因为它不符合我的需要,因为长时间运行的线程由信号量和其他锁定机制管理。)
【问题讨论】:
标签: .net multithreading