1 线程的优势
1.1 发挥多处理器的强大能力
多线程程序可以同时在多个处理器上执行。如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率。
1.2 建模的简单性
如果在程序中只包含一种类型的任务,那么比包含多种不同类型任务的程序要更易于编写,错误更少,也更容易测试。
1.3 异步时间的简化处理
服务器应用程序在接受来自多个远程客户端的套接字连接请求时,如果为每个连接都分配其各自的线程并且使用同步I/O,那么就会降低这类程序的开发难度。
1.4 响应更灵敏的用户界面
将长时间运行的任务放在一个单独的线程中运行,那么事件线程就能及时地处理界面事件,从而使用户界面具有更高的灵敏度。
2 线程带来的风险
2.1 安全性问题
线程安全性可能是非常复杂的,在没有充足同步的情况下,多个线程中的操作执行顺序是不可预测的,甚至会产生奇怪的结果。由于多个线程要共享相同的内存地址空间,并且时并行运行,因此它们可能会访问或修改其他线程正在使用的变量。虽然可以更容易实现数据共享,但线程有可能会由于无法预料的数据变化而发生错误。
2.2 活跃性问题
安全性的含义是“永远不发生糟糕的事情”,而活跃性则是“某件正确的事情最终会发生”。当某个操作无法继续执行下去时,就会发生活跃性问题。在串行程序中,活跃性问题的形式之一是无意中造成的无限循环。多线程将带来其他一些活跃性问题,比如:如果线程A在等待线程B释放其持有的资源,而线程B永远都不释放该资源,那么线程A就会永远的等待下去。
2.3 性能问题
在多线程程序中,当线程调度器临时挂起活跃线程并转而运行另一个线程时,就会频繁地出现上下文切换操作,这种操作将带来极大的开销:保存和恢复执行上下文,丢失局部性,并且CPU时间将将更多地花在线程调度而不是线程运行上。当线程共享数据时,必须使用同步机制,而这些机制往往会抑制某些编译器优化,使内存缓存区中的数据无效,以及增加共享内存总线的同步流量。所有这些因素都将带来额外的性能开销。