這是apg上關於proactor使用的例子,去掉了trace資訊,做了一點小修改:
code:
#include
#include
#include
#define listen_port 5222
class ha_proactive_service : public ace_service_handler
virtual void open (ace_handle h, ace_message_block&)
ace_message_block *mb;
ace_new_noreturn (mb, ace_message_block (1024));
if (this->reader_.read (*mb, mb->space ()) != 0)
}virtual void handle_read_stream (const ace_asynch_read_stream::result &result)
else
}virtual void handle_write_stream (const ace_asynch_write_stream::result &result)
private:
ace_asynch_read_stream reader_;
ace_asynch_write_stream writer_;
};class ha_proactive_acceptor : public ace_asynch_acceptor
;int ace_tmain (int, ace_tchar *)
程式在5222
埠上監聽,對於每個已建立的連線,伺服器將所有收到的資料列印到控制台上。這就是整個程式所實現的功能。
但是這個程式存在乙個很大的問題:沒有辦法正常結束。當執行這個程式後,只能強制結束這個程序,因為程式沒有提供從
proactor
事件迴圈中退出來的方法。
讓程式能夠正常退出是很有必要的,比如在進行記憶體洩漏的檢測時,如果程式沒有辦法正常退出,那麼記憶體洩漏的檢測工作將很難進行。
為了實現能夠正常關閉程式的目的,需要稍微修改一下上面的程式實現。
這次程式將會有兩個執行緒在執行,乙個是
proactor
事件迴圈執行緒,另乙個則為控制線程。在控制線程中,要能夠關閉
proactor
執行緒,然後將程式乾淨地退出。
得益於ace
強大的封裝,所做的改動並不大:
code:
class proactorthread : public ace_task_base
int close()
virtual int svc()
};int ace_tmain (int, ace_tchar *)
僅僅只是新增了乙個新的類,用於封裝
proactor
事件迴圈執行緒,另外修改了程式的主函式。這次程式將首先建立乙個
proactor
事件迴圈執行緒,然後主線程等待使用者輸入任意數後結束
proactor
執行緒,在
proactor
執行緒正常退出後主執行緒退出。
注意這裡有兩個要點:
1.當執行
proactor_end_event_loop()
之後,proactor
執行緒是從
proactor_run_event_loop()
處退出,所以會接著執行下面的**,列印出
」 thread ended」
資訊。2
.主線程必須使用
wait()
等待proactor
執行緒正常結束後再退出,否則如果主線程退出後,
proactor
執行緒仍有一些資源釋放工作未完成,那麼就會存在資源未正確釋放的問題。
謝幕,乙個時代的結束!
時間很快,明天開始投入考研複習中,今天是最後碼 了。曾經的痛苦,即將遠去,失去的東西才會珍惜。2個月後pat甲級,不管未來結果如何,保持努力的姿態就好。考研注定是一場鏖戰,中科院,zju,本校計科和自動化,都糾結過,痛苦過,現在心裡的答案漸漸明晰。心裡一定要有全域性觀,對時間既要進行巨集觀的分配,也...
這是乙個開始的結束
可以有江山一色,也可以有花鳥紛飛,我們的世界裡只要有實力,創造似乎並不是難事。難得是如何控制慾望,如何改動實際的布局。默默地守護和默默地抗爭,或許並不知道自己想要的是什麼,也不知道這存在有多大的意義,總之離不開利益,利益不均衡就會有問題,有鬥爭 有時候真的很孤單,卻又找不到我的她,她在哪 漫長的路程...
雜談 乙個故事的結束
月 日,期末考試的塵埃落定又標誌這我乙個學期的結束。看到朋友圈裡許多同學都寫下了自己對這個學期的總結,於是我也來趁著這個初二年級的結束來對我之前的學習做個總結 原諒我文筆不太好。我上次寫總結已經是2019年的暑假結束了,那麼這次就寫一些從那時到現在我的一系列故事吧。回想起這個學期,大部分時間都在網課...