最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++可擴展性與多線程超詳細精講

 更新時間:2022年10月31日 11:00:03   作者:無水先生  
這篇文章主要介紹了C++可擴展性與多線程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習吧

一、可擴展性和多線程

基于 Boost.Asio 之類的庫開發(fā)程序與通常的 C++ 風格不同。可能需要更長時間才能返回的函數(shù)不再按順序調(diào)用。 Boost.Asio 不調(diào)用阻塞函數(shù),而是啟動異步操作。操作完成后應(yīng)該調(diào)用的函數(shù)現(xiàn)在在相應(yīng)的處理程序中調(diào)用。這種方法的缺點是順序執(zhí)行函數(shù)的物理分離,這會使代碼更難理解。

諸如 Boost.Asio 之類的庫通常用于實現(xiàn)更高的效率。無需等待操作完成,程序可以在其間執(zhí)行其他任務(wù)。因此,可以啟動多個同時執(zhí)行的異步操作——請記住,異步操作通常用于訪問進程之外的資源。由于這些資源可以是不同的設(shè)備,它們可以獨立工作并同時執(zhí)行操作。

可擴展性描述了程序有效地從額外資源中受益的能力。借助 Boost.Asio,可以從外部設(shè)備同時執(zhí)行操作的能力中受益。如果使用線程,則可以在可用的 CPU 內(nèi)核上同時執(zhí)行多個功能。 Boost.Asio 的線程提高了可伸縮性,因為您的程序可以利用內(nèi)部和外部設(shè)備,這些設(shè)備可以獨立執(zhí)行操作或相互協(xié)作執(zhí)行操作。

如果在 boost::asio::io_service 類型的對象上調(diào)用成員函數(shù) run(),則在同一線程中調(diào)用關(guān)聯(lián)的處理程序。通過使用多個線程,程序可以多次調(diào)用 run()。一旦異步操作完成,I/O 服務(wù)對象將在這些線程之一中執(zhí)行處理程序。如果第二個操作在第一個操作之后不久完成,則 I/O 服務(wù)對象可以在不同的線程中執(zhí)行處理程序?,F(xiàn)在,不僅進程外的操作可以并發(fā)執(zhí)行,進程內(nèi)的處理程序也可以并發(fā)執(zhí)行。

二、線程示例

示例 32.3。 I/O 服務(wù)對象的兩個線程同時執(zhí)行處理程序

#include <boost/asio/io_service.hpp>
#include <boost/asio/steady_timer.hpp>
#include <chrono>
#include <thread>
#include <iostream>
using namespace boost::asio;
int main()
{
  io_service ioservice;
  steady_timer timer1{ioservice, std::chrono::seconds{3}};
  timer1.async_wait([](const boost::system::error_code &ec)
    { std::cout << "3 sec\n"; });
  steady_timer timer2{ioservice, std::chrono::seconds{3}};
  timer2.async_wait([](const boost::system::error_code &ec)
    { std::cout << "3 sec\n"; });
  std::thread thread1{[&ioservice](){ ioservice.run(); }};
  std::thread thread2{[&ioservice](){ ioservice.run(); }};
  thread1.join();
  thread2.join();
}

前面的示例已在示例 32.3 中轉(zhuǎn)換為多線程程序。使用 std::thread,在 main() 中創(chuàng)建了兩個線程。在每個線程中的唯一 I/O 服務(wù)對象上調(diào)用 run()。這使得 I/O 服務(wù)對象可以在異步操作完成時使用兩個線程來執(zhí)行處理程序。

在示例 32.3 中,兩個鬧鐘都應(yīng)在三秒后響起。因為有兩個線程可用,所以兩個 lambda 函數(shù)可以同時執(zhí)行。如果在執(zhí)行第一個鬧鐘的處理程序時第二個鬧鐘響起,則可以在第二個線程中執(zhí)行該處理程序。如果第一個鬧鐘的handler已經(jīng)返回,I/O服務(wù)對象可以使用任意線程執(zhí)行第二個handler。

當然,使用線程并不總是有意義的。示例 32.3 可能不會將消息按順序?qū)懭霕藴瘦敵隽?。相反,它們可能會混淆。兩個處理程序可能同時在兩個線程中運行,共享全局資源 std::cout。為避免中斷,需要同步對 std::cout 的訪問。如果處理程序不能同時執(zhí)行,線程的優(yōu)勢就喪失了。

示例 32.4。兩個 I/O 服務(wù)對象各有一個線程并發(fā)執(zhí)行處理程序

#include <boost/asio/io_service.hpp>
#include <boost/asio/steady_timer.hpp>
#include <chrono>
#include <thread>
#include <iostream>
using namespace boost::asio;
int main()
{
  io_service ioservice1;
  io_service ioservice2;
  steady_timer timer1{ioservice1, std::chrono::seconds{3}};
  timer1.async_wait([](const boost::system::error_code &ec)
    { std::cout << "3 sec\n"; });
  steady_timer timer2{ioservice2, std::chrono::seconds{3}};
  timer2.async_wait([](const boost::system::error_code &ec)
    { std::cout << "3 sec\n"; });
  std::thread thread1{[&ioservice1](){ ioservice1.run(); }};
  std::thread thread2{[&ioservice2](){ ioservice2.run(); }};
  thread1.join();
  thread2.join();
}

對單個 I/O 服務(wù)對象重復(fù)調(diào)用 run() 是使基于 Boost.Asio 的程序更具可擴展性的推薦方法。但是,您也可以創(chuàng)建多個 I/O 服務(wù)對象,而不是為一個 I/O 服務(wù)對象提供多個線程。

在示例 32.4 中,兩個 I/O 服務(wù)對象在兩個類型為 boost::asio::steady_timer 的鬧鐘旁邊使用。該程序基于兩個線程,每個線程綁定到另一個 I/O 服務(wù)對象。兩個 I/O 對象 timer1 和 timer2 不再綁定到同一個 I/O 服務(wù)對象。它們綁定到不同的對象。

示例 32.4 的工作方式與之前相同。無法就何時使用多個 I/O 服務(wù)對象提供一般性建議。因為 boost::asio::io_service 代表一個操作系統(tǒng)接口,所以任何決定都取決于特定的接口。

在 Windows 上,boost::asio::io_service 通?;?IOCP,在 Linux 上,它基于 epoll()。擁有多個 I/O 服務(wù)對象意味著將使用多個 I/O 完成端口,或者將多次調(diào)用 epoll()。這是否比僅使用一個 I/O 完成端口或一次調(diào)用 epoll() 更好取決于具體情況。

到此這篇關(guān)于C++可擴展性與多線程超詳細精講的文章就介紹到這了,更多相關(guān)C++可擴展性與多線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言科學(xué)計算入門之矩陣乘法的相關(guān)計算

    C語言科學(xué)計算入門之矩陣乘法的相關(guān)計算

    這篇文章主要介紹了C語言科學(xué)計算入門之矩陣乘法的相關(guān)計算,文章中還介紹了矩陣相關(guān)的斯特拉森算法的實現(xiàn),需要的朋友可以參考下
    2015-12-12
  • C++ 將字符串值賦給CHAR數(shù)組的實現(xiàn)

    C++ 將字符串值賦給CHAR數(shù)組的實現(xiàn)

    這篇文章主要介紹了C++ 將字符串值賦給CHAR數(shù)組的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • C語言實現(xiàn)掃雷代碼

    C語言實現(xiàn)掃雷代碼

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)掃雷代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++實現(xiàn)WebSocket服務(wù)器的案例分享

    C++實現(xiàn)WebSocket服務(wù)器的案例分享

    WebSocket是一種在單個TCP連接上進行全雙工通信的通信協(xié)議,與HTTP協(xié)議不同,它允許服務(wù)器主動向客戶端發(fā)送數(shù)據(jù),而不需要客戶端明確地請求,本文主要給大家介紹了C++實現(xiàn)WebSocket服務(wù)器的案例,需要的朋友可以參考下
    2024-05-05
  • C語言實現(xiàn)學(xué)生信息管理系統(tǒng)(多文件)

    C語言實現(xiàn)學(xué)生信息管理系統(tǒng)(多文件)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C語言入門篇--初識結(jié)構(gòu)體

    C語言入門篇--初識結(jié)構(gòu)體

    本篇文章是基礎(chǔ)篇,適合c語言剛?cè)腴T的朋友,本文對c語言的結(jié)構(gòu)體做了簡單的分析,幫助大家快速入門c語言的世界,更好的理解c語言
    2021-08-08
  • C++全排列中遞歸交換法實例詳解

    C++全排列中遞歸交換法實例詳解

    在本篇文章里小編給各位整理的是關(guān)于C++全排列中遞歸交換法實例內(nèi)容,有興趣的朋友們可以學(xué)習下。
    2020-02-02
  • C++模板的特化超詳細精講

    C++模板的特化超詳細精講

    最近我學(xué)習了C++中的模板相關(guān)知識,模板是泛型編程的基礎(chǔ),十分重要。所以特意整理出來一篇文章供我們一起復(fù)習和學(xué)習
    2022-08-08
  • C++實現(xiàn)LeetCode(159.最多有兩個不同字符的最長子串)

    C++實現(xiàn)LeetCode(159.最多有兩個不同字符的最長子串)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(159.最多有兩個不同字符的最長子串),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 利用C++ R3層斷鏈實現(xiàn)模塊隱藏功能

    利用C++ R3層斷鏈實現(xiàn)模塊隱藏功能

    在R3層的模塊隱藏,我們需要做的就是將其該鏈表斷鏈,將某一模塊從這個雙向鏈表中摘除,這樣再調(diào)用傳統(tǒng)的API時就會搜索不到。本文重點給大家介紹利用C++ R3層斷鏈實現(xiàn)模塊隱藏功能,感興趣的朋友一起看看吧
    2019-10-10

最新評論

澜沧| 中牟县| 黎川县| 乐清市| 张家界市| 涿鹿县| 石门县| 昭通市| 林西县| 临邑县| 永新县| 南郑县| 西和县| 武强县| 那坡县| 杭州市| 东丽区| 宣恩县| 沽源县| 永州市| 桓仁| 双峰县| 宁陕县| 双桥区| 大同市| 吴川市| 安宁市| 赣榆县| 安化县| 新兴县| 藁城市| 绥中县| 柳林县| 开原市| 通榆县| 苍南县| 涡阳县| 芒康县| 页游| 永平县| 清涧县|