欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++可擴(kuò)展性與多線程超詳細(xì)精講

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

一、可擴(kuò)展性和多線程

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

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

可擴(kuò)展性描述了程序有效地從額外資源中受益的能力。借助 Boost.Asio,可以從外部設(shè)備同時(shí)執(zhí)行操作的能力中受益。如果使用線程,則可以在可用的 CPU 內(nèi)核上同時(shí)執(zhí)行多個(gè)功能。 Boost.Asio 的線程提高了可伸縮性,因?yàn)槟某绦蚩梢岳脙?nèi)部和外部設(shè)備,這些設(shè)備可以獨(dú)立執(zhí)行操作或相互協(xié)作執(zhí)行操作。

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

二、線程示例

示例 32.3。 I/O 服務(wù)對(duì)象的兩個(gè)線程同時(shí)執(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)建了兩個(gè)線程。在每個(gè)線程中的唯一 I/O 服務(wù)對(duì)象上調(diào)用 run()。這使得 I/O 服務(wù)對(duì)象可以在異步操作完成時(shí)使用兩個(gè)線程來執(zhí)行處理程序。

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

當(dāng)然,使用線程并不總是有意義的。示例 32.3 可能不會(huì)將消息按順序?qū)懭霕?biāo)準(zhǔn)輸出流。相反,它們可能會(huì)混淆。兩個(gè)處理程序可能同時(shí)在兩個(gè)線程中運(yùn)行,共享全局資源 std::cout。為避免中斷,需要同步對(duì) std::cout 的訪問。如果處理程序不能同時(shí)執(zhí)行,線程的優(yōu)勢(shì)就喪失了。

示例 32.4。兩個(gè) I/O 服務(wù)對(duì)象各有一個(gè)線程并發(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();
}

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

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

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

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

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

相關(guān)文章

  • 一起來學(xué)習(xí)C++的動(dòng)態(tài)內(nèi)存管理

    一起來學(xué)習(xí)C++的動(dòng)態(tài)內(nèi)存管理

    這篇文章主要為大家詳細(xì)介紹了C++的動(dòng)態(tài)內(nèi)存管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++中對(duì)象&類的深入理解

    C++中對(duì)象&類的深入理解

    這篇文章主要給大家介紹了關(guān)于C++中對(duì)象&類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • C++貪心算法實(shí)現(xiàn)馬踏棋盤

    C++貪心算法實(shí)現(xiàn)馬踏棋盤

    這篇文章主要為大家詳細(xì)介紹了C++貪心算法實(shí)現(xiàn)馬踏棋盤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++實(shí)現(xiàn)Date類各種運(yùn)算符重載的示例代碼

    C++實(shí)現(xiàn)Date類各種運(yùn)算符重載的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)Date類各種運(yùn)算符重載的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • C語(yǔ)言中深度優(yōu)先搜索(DFS)算法的示例詳解

    C語(yǔ)言中深度優(yōu)先搜索(DFS)算法的示例詳解

    這篇文章主要通過兩個(gè)簡(jiǎn)單的示例為大家詳細(xì)介紹一下C語(yǔ)言中深度優(yōu)先搜索(DFS)算法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-02-02
  • 手把手教你用C語(yǔ)言實(shí)現(xiàn)三子棋

    手把手教你用C語(yǔ)言實(shí)現(xiàn)三子棋

    三子棋是黑白棋的一種。三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。這篇文章就教你如何用C語(yǔ)言實(shí)現(xiàn)三子棋的功能
    2021-08-08
  • C語(yǔ)言中設(shè)置進(jìn)程優(yōu)先順序的方法

    C語(yǔ)言中設(shè)置進(jìn)程優(yōu)先順序的方法

    這篇文章主要介紹了C語(yǔ)言中設(shè)置進(jìn)程優(yōu)先順序的方法,包括setpriority()函數(shù)和getpriority()函數(shù)以及nice()函數(shù),需要的朋友可以參考下
    2015-08-08
  • C++三體星戰(zhàn)小游戲源代碼

    C++三體星戰(zhàn)小游戲源代碼

    這篇文章主要給大家介紹了關(guān)于C++三體星戰(zhàn)小游戲的相關(guān)資料,文中給出了詳細(xì)完整的代碼示例,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • 基于C++中覆蓋,重載,隱藏的一點(diǎn)重要說明

    基于C++中覆蓋,重載,隱藏的一點(diǎn)重要說明

    下面小編就為大家?guī)硪黄贑++中覆蓋,重載,隱藏的一點(diǎn)重要說明。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • OpenCV實(shí)現(xiàn)圖像校正功能

    OpenCV實(shí)現(xiàn)圖像校正功能

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)圖像校正功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05

最新評(píng)論