菜菜博士

欢迎来到 菜菜博士 在网络的家



异步单线程的梦


很享受单线程带来的好处。

第一:不用考虑锁。
第二:不用考虑线程切换开销。
第三:很锻炼人异步并发的思想。

特别是第三点,我觉得最喜欢了。
非常喜欢异步执行,异步通知。
用一个线程,完成了所有的逻辑。而且不能阻塞在一个逻辑上。如果需要阻塞,就采用异步通知,等它ready了再处理。

单线程异步并发用的久了
突然有一天碰上了 ALSA ... ... ...
居然再也不能使用了。。。。。。
ALSA 的异步通知只有一种。那就是信号。
但是信号是不可靠的,而且信号数目有限,怎么能用来做异步通知呢?(所以也很讨厌 aio)
ALSA 居然不能方便的时候 poll/epoll 来进行通知,各种事件非得用 alsa_*(会阻塞的) 获得  .... 逼我用多线程。

当然,PulseAudio 的话 ... 由于是 socket 连接,可以继续你的异步梦了 ..... but .. who likes pa ?

很多地方都可以异步单线程,而且都是使用的 epoll/poll 通知机制, 所以,任何可能会阻塞的地方,如果能使用 poll
那么,永远都不用当心你的梦会破灭 ... (ALSA该死,破灭我一次)

最后,用 Alan Cox 的名言来打击一下使用多线程的人:

 computer is a state machine. Threads are for people who can't program state machines. (计算机是一台状态机。线程是给那些不能编写状态机程序的人准备的。)

文件IO == 使用 poll/epoll
套接字 == 使用 poll/epoll
Direct IO == 使用 poll/epoll
Timer == 巧妙的编入 polll/eppll 的 timeout 参数
空闲  == 利用 poll/epoll timeout=0
抓包 == pcap_fileno 获得文件描述符,使用 poll/epoll
GUI == 获得 X11 连接的文件描述符,使用 poll/epoll
OpenGL == OpenGL is natively async with GPU , OpenGL 错误被合并入 X11 汇报
文件监视 == 返回的也是文件描述符
Netlink == 返回的也是套接字
2 条评论
# 1: November 3, 2010, 6:59 pm, cloverprince said:

嗯。我还记得曾经有人说过:编程语言本来就不应该支持递归,因为所有的递归程序都可以用堆栈和非递归的程序代替。如果你不会把递归的程序改成非递归的,你应该重新学编程。

另外,有没有办法让一个单线程状态机程序利用两个或多个CPU呢?

# 2: November 27, 2010, 11:40 pm, microcai said:

如果需要用多个 CPU 干活,通常是体力活。我会用线程池的。
主要的逻辑,非体力活我就不使用线程。
添加评论

昵称 *

E-mail