



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第C++可擴展性與多線程超詳細精講目錄一、可擴展性和多線程二、線程示例
一、可擴展性和多線程
基于Boost.Asio之類的庫開發程序與通常的C++風格不同。可能需要更長時間才能返回的函數不再按順序調用。Boost.Asio不調用阻塞函數,而是啟動異步操作。操作完成后應該調用的函數現在在相應的處理程序中調用。這種方法的缺點是順序執行函數的物理分離,這會使代碼更難理解。
諸如Boost.Asio之類的庫通常用于實現更高的效率。無需等待操作完成,程序可以在其間執行其他任務。因此,可以啟動多個同時執行的異步操作請記住,異步操作通常用于訪問進程之外的資源。由于這些資源可以是不同的設備,它們可以獨立工作并同時執行操作。
可擴展性描述了程序有效地從額外資源中受益的能力。借助Boost.Asio,可以從外部設備同時執行操作的能力中受益。如果使用線程,則可以在可用的CPU內核上同時執行多個功能。Boost.Asio的線程提高了可伸縮性,因為您的程序可以利用內部和外部設備,這些設備可以獨立執行操作或相互協作執行操作。
如果在boost::asio::io_service類型的對象上調用成員函數run(),則在同一線程中調用關聯的處理程序。通過使用多個線程,程序可以多次調用run()。一旦異步操作完成,I/O服務對象將在這些線程之一中執行處理程序。如果第二個操作在第一個操作之后不久完成,則I/O服務對象可以在不同的線程中執行處理程序。現在,不僅進程外的操作可以并發執行,進程內的處理程序也可以并發執行。
二、線程示例
示例32.3。I/O服務對象的兩個線程同時執行處理程序
#includeboost/asio/io_service.hpp
#includeboost/asio/steady_timer.hpp
#includechrono
#includethread
#includeiostream
usingnamespaceboost::asio;
intmain()
io_serviceioservice;
steady_timertimer1{ioservice,std::chrono::seconds{3}};
timer1.async_wait([](constboost::system::error_codeec)
{std::cout"3sec\n";});
steady_timertimer2{ioservice,std::chrono::seconds{3}};
timer2.async_wait([](constboost::system::error_codeec)
{std::cout"3sec\n";});
std::threadthread1{[ioservice](){ioservice.run();}};
std::threadthread2{[ioservice](){ioservice.run();}};
thread1.join();
thread2.join();
}
前面的示例已在示例32.3中轉換為多線程程序。使用std::thread,在main()中創建了兩個線程。在每個線程中的唯一I/O服務對象上調用run()。這使得I/O服務對象可以在異步操作完成時使用兩個線程來執行處理程序。
在示例32.3中,兩個鬧鐘都應在三秒后響起。因為有兩個線程可用,所以兩個lambda函數可以同時執行。如果在執行第一個鬧鐘的處理程序時第二個鬧鐘響起,則可以在第二個線程中執行該處理程序。如果第一個鬧鐘的handler已經返回,I/O服務對象可以使用任意線程執行第二個handler。
當然,使用線程并不總是有意義的。示例32.3可能不會將消息按順序寫入標準輸出流。相反,它們可能會混淆。兩個處理程序可能同時在兩個線程中運行,共享全局資源std::cout。為避免中斷,需要同步對std::cout的訪問。如果處理程序不能同時執行,線程的優勢就喪失了。
示例32.4。兩個I/O服務對象各有一個線程并發執行處理程序
#includeboost/asio/io_service.hpp
#includeboost/asio/steady_timer.hpp
#includechrono
#includethread
#includeiostream
usingnamespaceboost::asio;
intmain()
io_serviceioservice1;
io_serviceioservice2;
steady_timertimer1{ioservice1,std::chrono::seconds{3}};
timer1.async_wait([](constboost::system::error_codeec)
{std::cout"3sec\n";});
steady_timertimer2{ioservice2,std::chrono::seconds{3}};
timer2.async_wait([](constboost::system::error_codeec)
{std::cout"3sec\n";});
std::threadthread1{[ioservice1](){ioservice1.run();}};
std::threadthread2{[ioservice2](){ioservice2.run();}};
thread1.join();
thread2.join();
}
對單個I/O服務對象重復調用run()是使基于Boost.Asio的程序更具可擴展性的推薦方法。但是,您也可以創建多個I/O服務對象,而不是為一個I/O服務對象提供多個線程。
在示例32.4中,兩個I/O服務對象在兩個類型為boost::asio::steady_timer的鬧鐘旁邊使用。該程序基于兩個線程,每個線程綁定到另一個I/O服務對象。兩個I/O對象timer1和timer2不再綁定到同一個I/O服務對象。它們綁定到不同的對象。
示例32.4的工作方式與之前相同。無法就何時使用多個I/O服務對象提供一般性建議。因為boost::asio::io_service代表一個操作系統接口,所以任何決定都取決于特定的接口。
在Win
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二手房買賣合同違約責任追究協議
- 財務報表風險敞口應對效果評估合同
- 材料疲勞斷裂數據校正合同
- 生態農業園區場地合作經營與產品銷售協議
- 邊疆地區古代商業貿易考古合同
- 高端裝備制造廠房租賃與智能化改造協議
- 大學刑法考試題及答案
- 群體健康策略課件
- 調研安全生產工作方案
- 安全總監個人述職報告3
- 2024年廣東省中考物理試卷(含答案逐題解析)
- 武術專業個人簡歷模板范文
- LD水電站智慧工程建設方案研究
- DB37-T 4384-2021 混凝土橋梁有效預應力無損檢測技術規程
- 竣工財務決算報表模板
- 2021利達JB-QG-LD988EL JB-QT-LD988EL 火災報警控制器 消防聯動控制器調試手冊
- 2024年中鐵(天津)軌道交通投資建設限公司運營管理人員招聘5人高頻考題難、易錯點模擬試題(共500題)附帶答案詳解
- 創傷中心匯報
- 裝配式結構吊裝施工計算書
- 2024安徽蕪湖市中江城建集團限公司下屬子公司社會招聘60人公開引進高層次人才和急需緊缺人才筆試參考題庫(共500題)答案詳解版
- 放射科疑難病例分析討論記錄
評論
0/150
提交評論