??? ?? ACE_WFMO_Reactor允許多個(gè)線程并發(fā)的調(diào)用handle_events(),這個(gè)能力的增加使得它的設(shè)計(jì)變的復(fù)雜,并且引入了一些同基于select的反應(yīng)器不同的地方.不同點(diǎn)如下:
- 注冊(cè)改變的協(xié)調(diào).已注冊(cè)句柄集合的每一個(gè)改變,將會(huì)影響到所有執(zhí)行事件循環(huán)的線程.在沒有同步的情況下允許這些改變的發(fā)生,會(huì)導(dǎo)致丟失事件,或不正確,不合法的句柄被分發(fā).為了在多線程的情況下,正確的處理注冊(cè)發(fā)生改變的情況,ACE_WFMO_Reactor維持了三個(gè)句柄信息集合對(duì)象.
- 用作事件偵查和分發(fā)的當(dāng)前句柄
- 新句柄, 除了當(dāng)前句柄集合,新句柄也在等待
- 掛起句柄,是當(dāng)前句柄中掛起的句柄
當(dāng)需要改變已注冊(cè)的句柄時(shí),(例如:注冊(cè),移除,掛起和恢復(fù)一個(gè)事件處理器),要記住句柄,事件處理器,事件類型信息,和相關(guān)信息的記錄.下一個(gè)完成handle_events的線程會(huì)注意到這個(gè)改變,獲取reactor的鎖,等待所有其他正在運(yùn)行handle_events的線程完成.為了能讓這些線程及時(shí)的完成,等待的線程發(fā)送一個(gè)內(nèi)部事件,該內(nèi)部事件是分發(fā)句柄集合的一部分.喚醒所有阻塞在WaitForMultipleObjects的線程.這個(gè)時(shí)候,所有的事件處理線程將會(huì)阻塞在等待變化的發(fā)生.當(dāng)原始的線程完成必要的信息和句柄改變后,釋放reactor的鎖.所有的事件處理線程重新開始在更新后的句柄集合上進(jìn)行等待,分離和分發(fā).
- 推遲事件處理器的清除.ACE_WFMO_Reactor注冊(cè)改變的延遲引入了一些與基于select()的反應(yīng)器的不同之處.當(dāng)hanle_*()方法返回-1或者ACE_Reactor::remove_handler()被事件處理器調(diào)用時(shí),它推遲事件處理器的移除和handle_close()鉤子函數(shù)的回調(diào),直到上面說講的注冊(cè)改變發(fā)生.所以一個(gè)應(yīng)用在請(qǐng)求ACE_WFMO_Reactor移除一個(gè)事件處理器之后,不能立即刪除該事件處理器,否則reator后來調(diào)用的handle_close()方法會(huì)分發(fā)一個(gè)無效的指針.