我什么时候应该使用线程?

cam*_*cam 17 multithreading

就我而言,理想的线程数量是3:一个用于UI,一个用于CPU资源,一个用于IO资源.

但我可能错了.

我刚刚介绍给他们,但我总是使用一个用于UI,一个用于其他一切.

我什么时候应该使用线程?我怎么知道我是否应该使用它们?

Cra*_*nec 15

不幸的是,使用Threads并没有严格的规则.如果您有太多线程,处理器将花费所有时间在它们之间生成和切换.使用太少的线程,您将无法获得应用程序中所需的吞吐量.另外使用线程并不容易.像C#这样的语言让你更容易,因为你有像这样的工具ThreadPool.QueueUserWorkItem.这允许系统管理线程创建和销毁.这有助于减少创建新线程以将工作传递到其上的开销.你必须记住,创建一个线程不是你"免费"获得的操作.启动线程会产生相关成本,因此应始终考虑这些成本.

根据您用于编写应用程序的语言,您将决定使用线程需要多少担心.

我经常发现我需要考虑明确创建线程的时间是:

  • 异步操作
  • 可以并行化的操作
  • 持续运行后台操作


Pup*_*ppy 9

答案完全取决于您的计划.但是,一个CPU资源是一个不好的举措 - 你的CPU在零售CPU中可能有多达六个内核和超线程,而大多数CPU将有两个或更多.在这种情况下,您应该拥有与CPU核心一样多的线程,以及一些用于调度事故的线程.整个CPU不是单线程的野兽,它可能有很多核心,需要很多线程才能100%利用.

当且仅当您的目标人口统计数据几乎都具有多核(如当前台式机/笔记本电脑市场的情况)时,您应该使用线程,并且您已确定一个核心的性能不够.


Mar*_*tos 5

SQLite FAQ:" 线程是邪恶的.避免使用它们." 只有在你必须的时候才使用它们.

如果必须,请采取措施避免通常的屠杀.使用线程池执行细粒度的任务,没有相互依赖性,使用GUI框架提供的工具将结果分发回UI.避免在长时间运行的线程之间共享数据; 使用消息队列在它们之间传递信息(并进行同步).

更奇特的解决方案是使用Erlang等语言,这些语言专为细粒度并行而设计,而不会牺牲安全性和可理解性.并发本身对计算的未来至关重要; 线程只是表达它的一种可怕的,破碎的方式.

  • 不要教条.线程本身并不邪恶.分离UI和后台活动线程是一种很好的模式,它提供了更好的用户体验. (8认同)
  • +1:如果你可以逃避不使用线程,那么这样做 - 它肯定会使测试和调试变得更加容易,并且从长远来看可能会产生更稳定的产品.如果你*有*使用线程,那么明智地做. (2认同)
  • @Andrey,我认识的最聪明的人在他们的代码中使用线程最不乐观.按照我提供的PDF链接. (2认同)
  • @Marcelos,PDF并不是说不使用并行性,只是不使用线程习惯来实现它.您可能希望明确表示,您只是通过顺序进程之间的消息传递来提倡并行性,而不是提倡不并行性. (2认同)

Jes*_*cer 5

Herb Sutter 为Dobb博士的期刊撰写了一篇文章,其中他谈到了并发的三大支柱.本文非常好地分解了哪些问题是通过线程结构解决的好选择.