為什麼要使用ACE_Task來管理線程
從C#轉到C++後,感覺到C++比C#最難的地方,就是在系統編程時,C#中有對應的類庫,我接觸到一個類後,就可以通過這個類,知道很多相關的功能。而在C++中,必須使用Windows API,但是Windows API的缺點反而是不系統。比如,想要創建一個線程時,C#中可以通過新建一個Thread類,我得到這個類後,就可以通過幫助或者MSDN了解到這個類中有哪些方法,如何管理線程等。但是C++中,創建一個線程,需要調用CreateThread,但因為它是一個API,所以很難快速的了解到與線程管理相關的API,至少對我來說,這是一個難點。
C#的優勢是以類的方式去管理線程,而C++ 調用API更像是在單打獨斗,顯得特別特別散亂。
那麼在C++中,我們能不能以類的方式去管理線程呢。針對這個問題,ACE_Task便浮出了水面。
ACE_Task使用方法
ACE_Task對常用線程處理進行了OO包裝,通過ACE_Task,能對線程進行更好的操作。
根據ACE_Task的父類ACE_Task_Base中的注釋,可以總結出以下幾點:
想要使用ACE_Task,就要從ACE_Task派生一個子類,然後實現比較重要的幾個虛方法。
實現服務初始化和終止方法:open()方法應該包含所有專屬於任務的初始化代碼。其中可能包括諸如連接控制塊、鎖和內存這樣的資源。close() 方法是相應的終止方法。
調用啟用(Activation )方法:在主動對象實例化後,你必須通過調用activate()啟用它。要在主動對象中創建的線程的數目,以及其他一些參數,被傳遞給activate()方法。activate()方法會使svc()方法成為所有它生成的線程的啟動點。
實現服務專有的處理方法:如上面所提到的,在主動對象被啟用後,各個新線程在svc()方法中啟動。應用開發者必須在子類中定義此方法。