7.5
有效使用反應堆的設計準則
ace_reactor
是事件多路分離和事件處理器分派的強大構架。但是,像其他構架一樣,學習使用
ace_reactor
需要時間和努力。縮短學習曲線的的一種途徑是去理解有效使用反應堆所必須遵從的設計準則。下面描述的設計準則基於幫助
ace使用者正確進行反應堆構架程式設計所獲得的大量經驗。
設計準則0:不要手工刪除事件處理器物件或顯式呼叫
handle_close
棗相反,確保
ace_reactor
自動呼叫
handle_close
清掃方法。因而,應用必須遵從適當的協議來移除事件處理器,也就是,或者通過(1)從
handle_*
掛鉤方法中返回負值,或者通過(
2)呼叫
remove_handler
。 該設計準則確保
ace_reactor
能夠適當地清掃它的內部表。如果不服從這一準則,當
ace_reactor
試圖移除已經在外部被刪除的具體事件處理器時,就會帶來不可**的記憶體管理問題。後面的設計準則詳細說明怎樣確保
ace_reactor
呼叫handle_close
清掃方法。
設計準則1:從繼承自
ace_event_handler
的類的handle_*
方法中返回的表示式必須是常量(
constant
)。這一設計準則有助於靜態地檢查是否
handle_*
方法返回了恰當的值。如果必須違反此準則,開發者必須在
return
語句之前加一注釋,解釋為何要使用變數,而不是常量。
設計準則2:
如果從繼承自
ace_event_handler
的類的
handle_*
方法中返回的值不為
0 ,必須在
return
語句之前加一注釋,說明該返回值的含義
。這一設計準則確保所有非
0的返回值都是開發者有意使用的。
設計準則3:
當你想要觸發具體事件處理器的相應
handle_close
清掃方法時,從
handle_*
方法中返回乙個負值
。值-1
通常用於觸發清掃掛鉤,因為它是
ace_os
系統呼叫包裝中乙個常用的錯誤**。但是,任何來自
handle_*
方法的負數都將觸發
handle_close
。設計準則4:
將所有event_handler
清掃活動限制在
handle_close
清掃方法中
。一般而言,將所有的清掃活動合併到
handle_close
方法中,而不是分散在事件處理器的各個
handle_*
方法中要更為容易。在處理動態分配的、必須用
delete this
來清除的事件處理器時,特別需要遵從此設計準則(見準則9)。
設計準則5:
不要將絕對時間用作
ace_reactor::schedule_timer
的第三或第四引數
。一般而言,這些引數應該小於乙個極長的延遲,更遠小於當前時間。
設計準則6:
不要delete
不是動態分配的事件處理器
。任何含有
delete this
、而其類又沒有私有析構器的
handle_close
方法,都有可能違反這一設計準則。在缺乏一種能夠靜態地識別這一情況的規約檢查器時,應該在
delete this
的緊前面加上注釋,解釋為何要使用這一習語。
設計準則7:
總是從堆中動態分配具體事件處理器
。這是解決許多與具體處理器的生存期有關的問題的相對直接的方法。如果不可能遵從此準則,必須在具體事件處理器登記到
ace_reactor
時給出注釋,解釋為什麼不使用動態分配。該注釋應該在將靜態分配的具體處理器登記到
ace_reactor
的register_handler
語句的緊前面出現。
設計準則8:
在ace_event_handler
退出它們「生活」的作用域之前,從與它們相關聯的
ace_reactor
中將它們移除掉
。該準則應在未遵從準則
7的情況下使用。
設計準則9:
只允許在
handle_close
方法中使用
delete this
習語,也就是,不允許在其他
handle_*
方法中使用
delete this
。該準則有助於檢查是否有與刪除非動態分配的記憶體有關的潛在錯誤。自然,與
ace_reactor
無關的元件可以擁有不同的對自刪除進行管轄的準則。
設計準則10:
僅在為具體事件處理器所登記的最後乙個事件已從
ace_reactor
中移除時執行
delete this
操作。過早刪除在
ace_reactor
上登記了多個事件的具體處理器會導致「晃蕩的指標」,遵從此準則可以避免發生這樣的情況。
設計準則11:
當你不再需要具體事件處理器的
handle_output
方法被**時,清除
write_mask
。設計準則12:
確定get_handle
方法的特徵與
ace_event_handler
基類中的一致
。如果你不遵從此準則,並且你「隱式地」將
ace_handle
傳遞給ace_reactor
,ace_event_handler
基類中的預設
get_handle
將返回-1
,而這是錯誤的。
設計準則13:
當連線關閉時(或當連線上發生錯誤時),從
handle_*
方法中返回乙個負值
。設計準則14:
在handle_close
方法中呼叫
remove_handler
時,總是傳遞給它
dont_call
標誌。該準則確保
ace_reactor
不會遞迴地呼叫
handle_close
方法。下面的**演示怎樣應用此準則:
反應堆模式
1 定義 反應堆模式是一種物件行為類的設計模式,對同步事件分揀和派發。它是處理併發i o比較常見的一種模式,用於同步i o。其中心思想是將所有要處理的i o事件註冊到乙個中心i o多路復用器上,同時主線程阻塞在多路復用器上 一旦有i o事件到來或者是準備就緒,多路復用器返回並將相應的i o事件分發到...
反應堆問題
維克多博士創造了乙個裂變反應堆,可取用處於液體狀態的放射性物質。反應堆的容量是v加侖。他有n瓶的放射性液體,每個都有一定的質量和一定的體積。當液體倒入反應堆時,也產生一些單位的能量。現在,維克多想要將能量輸出最大化。但是,有乙個限制條件。他研究了原子元素的物理知識和歷史,認識到反應堆內放射性液體的總...
reactor 反應堆模型
1.reactor模型,本質上講管理網路io 使用下面這個結構用來管理我們的io struct ntyreactor 下面這段 比較核心 我們關心的事件與發生的事件發生時,才去呼叫 2.實現 include include include include include include includ...