原文地址:
http://www.cppblog.com/eXile 对于使用线程池的Reactor模式,针对每一个SOCKET句柄的事件处理器handler可能被分派到不同的线程当中,这就要求handler的每一个操作都是线程安全的。
可以使用一种办法使一个handler的操作只能分派到一个线程中:为每一个handler设定一个线程所有者ID,一开始ID为空,则每个线程都可以分派,第一次分派之后,则设定为该线程ID,以后只分派到该线程中。这样,可以保证handler操作的单线程性,简化以后handler的具体实现。这个ID也可以灵活设置,以适应具体事务的要求。
但这样并不能保证handler彻底无锁,因为还会有两个线程会出现竟争,除了这个事件处理线程以外,还有事件分派线程(即事件侦听线程)。对于这个问题的解决办法如下:为每个handler设定一个原子计数,事件分派线程在分派事件前,首先设定该原子计数,若设置失败,表明此时正有其它线程在处理该handler,则并不分派该事件,而是将它置于一个pending队列中,等待以后分派。
还有一种简单的方法,就是将该handler直接挂起,处理完后才允许进行事件分派。