標籤:blog http io os 使用 ar 資料 art on
轉自:http://blog.csdn.net/mjp_mjp/article/details/4406059
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。
【轉】ACE編程小結