异步单线程的梦

Posted on October 10, 2010

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

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

特别是第三点,我觉得最喜欢了。 非常喜欢异步执行,异步通知。 用一个线程,完成了所有的逻辑。而且不能阻塞在一个逻辑上。如果需要阻塞,就采用异步通知,等它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 == 返回的也是套接字

Comments