原文地址:
http://www.shnenglu.com/eXile 對于使用線程池的Reactor模式,針對每一個SOCKET句柄的事件處理器handler可能被分派到不同的線程當中,這就要求handler的每一個操作都是線程安全的。
可以使用一種辦法使一個handler的操作只能分派到一個線程中:為每一個handler設(shè)定一個線程所有者ID,一開始ID為空,則每個線程都可以分派,第一次分派之后,則設(shè)定為該線程ID,以后只分派到該線程中。這樣,可以保證handler操作的單線程性,簡化以后handler的具體實現(xiàn)。這個ID也可以靈活設(shè)置,以適應(yīng)具體事務(wù)的要求。
但這樣并不能保證handler徹底無鎖,因為還會有兩個線程會出現(xiàn)竟爭,除了這個事件處理線程以外,還有事件分派線程(即事件偵聽線程)。對于這個問題的解決辦法如下:為每個handler設(shè)定一個原子計數(shù),事件分派線程在分派事件前,首先設(shè)定該原子計數(shù),若設(shè)置失敗,表明此時正有其它線程在處理該handler,則并不分派該事件,而是將它置于一個pending隊列中,等待以后分派。
還有一種簡單的方法,就是將該handler直接掛起,處理完后才允許進行事件分派。