C++可扩展性与多线程超详细精讲_第1页
C++可扩展性与多线程超详细精讲_第2页
C++可扩展性与多线程超详细精讲_第3页
C++可扩展性与多线程超详细精讲_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论