ACE編程小結(轉)


1、多線程中的ACE_Reactor::EventLoop,當在多線程(池)中調用EventLoop時,需要注意,在 Acceptor/EventHandler中要使用其中的方法Reactor()來獲取ACE_Reactor的指針,不要使用 ACE_Reactor::instance,道理很簡單喲。不過,一定要注意,在編程時,使用Reactor()類方法,比使用單件的方法要好很多,起碼安全,也不會破壞封裝性。

2、ACE_Task中的Msg_Queue,這個類的確很迷人,不過要注意getq和putq都可能會引起阻塞,因此,最好使用超時的方式來調用它們,特別是在結束這個task時候。因爲,你要清空msg_queue,如果不超時,你可能無法安全的退出線程。

3、 ACE_Svc_Handler,這個類很好,它繼承於ACE_Task,因此它有msg_queue,還可以被用於ACE的組件配置模型中。其中對於 handle_output,要注意,因爲它不會自動被框架調用,除非你使用了策略類 ACE_Reactor_Notification_Strategy(msg_queue需要它,windows下用的是完成端口),它使用流控制方式通知你可以寫。而且,在handle_output內,不要吝惜,一定要使用while,把msg_queue裏面的message_block儘可能全部取出,然後發送出去(直到send返回-1,errono=EWOULDBLOCK)。

4、Acceptor/Handler,要在 end_event_loop之前被清除。如果使用了new創建acceptor的話,最好在end_event_Loop前,註銷它,即在 handle_close時用參數DONT_CALL註銷,並delete。如果你是在end_event_loop 後在刪除它的話,ACE保證會讓你遇到無法讓你冷靜的崩潰斷言等致命錯誤。有一種思想,就是如果new出來的對象指針,在程序退出前,一直沒有變化,也就是說,對象依然被你掌控的話,你可以不用去delete,而且,這個也不叫內存泄露。因爲現在的操作系統,在進程被殺死後,會清理進程使用過的空間。

5、善使局部類(在函數體中聲明定義的類),嚴格意義上講,這個不是ace範疇。局部類對象,可以共享全局/靜態的數據,但是不能直接使用函數體內的數據;或者成員函數所在類內的變量,不過可以使用所在類指針,訪問類的私用成員。這個很強悍,可以做一些很私密的處理。而且,可以利用這一點,返回一個局部類對象指針(當然是void*),而c++保證,外界無法訪問訪問它,更不能刪除它。

6、EMSGSIZE,這個errorcode,我當初沒有理解,只是在實踐中碰到了,當你請求的數據length,小於實際數據長度時,會有這個error。這時,我們可以採取約定的方式,即,我們每次不得發送數據長度超過MTU的包,接收當然也不會超過這個數值。也不會報這個error。而且這樣做有好處,起碼可以防止別人惡意發送長度很大的包來攻擊你。而且,更重要的是,小於MTU的數據不會被分包傳輸,數據安全而且可靠。這點對tcp/udp同樣適用喲。

7、ace用於mfc環境,或者說用於共享庫(dll、so等)時,最好在使用前使用ACE::init初始化一下,並在退出前使用ACE::fini。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章