多线程是我们日常开发中或多或少都会遇到的,它涉及了很多概念:线程安全/竞争条件、锁/死锁检测、同步/异步、阻塞/非阻塞、信号量/事件、线程池、生产消费模型等等。面对这些纷繁复杂的东西你是不是有点头大(如果你现在没有以后也会有的),你难道不想找寻一种可以让自己轻松点的方法?反正我是一直在思索尝试,直到最近了解了Erlang、Stackless Python并开始研究协程、微线程以后,我才有种豁然开朗的感觉。
你可能要问了,“协程、微线程”这名词听起来挺酷的但是它们比起传统的多线程开发好在那里呢?这个问题我确实很难回答出来,也许只有经历过的人能感同身受。不过我倒是可以说说传统开发方式的一些弊端,让你自己来做个判断。
1. 线程安全/临界条件:这是一个很让人讨厌的东西一不小心就会出错而且还很难查找。也许你忘了在操作一个静态(全局)的List或Hashtab时加锁,亦或是你在一个异步回调函数中再次调用了当前线程的方法造成了死锁。如果这些问题在产品上线以后不规律出现那你可以惨了。
2.同步/异步:在同步且阻塞的时候你要自己开线程或者使用线程池,而异步的时候要使用回调函数或者异步委托(.net的Delegate)来处理。而无论同步、异步其实都是借助其他线程来处理,等处理完了就需要你来做一些线程同步的事情。比如通知主线程或对结果处理后再次做异步处理等。这时你就要借助semaphore/event(不是.net中的事件)、join等来帮你完成,这实在是劳心费力的事情。
3.性能:其实这个问题才是最困难的,因为线程这个东西是内核对象开多了再好的机器也负载不了,开少了无法满足需求。所以这时候你就要去学习一些并发模型来解决这个问题。比如做tcp服务端程序你不可能使用一个线程单独去处理一个socket请求,而可能的方法是用一个线程来监控一组s