谈谈Boost网络编程(3)—— 一些坑

       很多时候,我们以为采用了一种新技术(尤其是成熟的技术),过程应该是一马平川的。然而实际上,采用新技术的过程却是掉入了各种坑里。究其原因,或者是使用方式有问题,或者是效率的白白浪费。这一章,我想讲讲,我在使用Boost Asio进程网络编程时,所遇到的各种坑。

       其一、CPU占用100%问题。

       在没有采用异步编程之前,程序占用100%基本是不敢想象的事情,因为一旦程序占用100%的CPU,那必然是代码中出现了死循环的BUG。但是采用了Boost Asio后,我发现新系统很容易就跑满了CPU。Why?

       1)服务端接收任务过快。快一直是我们系统所追求的,为此我们特别进行了优化,支持一次接收一组任务(100-300之间)。然而我们处理任务时,client一次最多只能够处理10条任务,这就是典型的生产者-消费者问题。生产者能力大于消费者,而且消费者在消化时(HTTP发送任务时),对方反馈是同步反馈的,这就造成了CPU的持续增加。再则,任务完毕被发送到report_runner时,反馈任务是一条一条反馈,这又是生产能力大于了消费能力。

       针对此问题,我们做了一些限制和优化:stream_server增加限速功能,report_client可以合并反馈。

      2)bind意味着拷贝,尽量在bind时传递指针而不是实例。

      其二、shared_ptr和多态。

      如果我有一个基类的shared_ptr,我可以用它来指向具体的子类吗?答案是需要将子类的shared_ptr赋值于这个指针,否则无法实现多态。

      其三、子进程问题。

       由于我们的客户端只运行于linux,所以这里只描述在基于boost asio的多线程程序中如何再做到多进程。注意:这里有一个前提,子进程中只调用shell或可执行,并不用到父进程中的asio实例。

       为什么要单独讲子进程问题呢?因为Boost的asio并不是fork安全的,而且其Doc中特别指出了在子进程中需要调用notify_event来通知asio以使fork安全。这至少造成了我的疑惑:如果我不需要在子进程中使用Asio,我还需要notify吗?答案是不需要。正如我们系统所遇到的,只需要调用linux的exec*即可。

       进一步,由于我们并不需要拷贝父进程,所以用vfork取代了fork。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: C++ Boost库是一组C++模板库,提供了许多实用的类和函数,其中包括网络编程Boost.AsioBoost库中的一个子库,专门用于网络编程。它提供了高效、可移植的、非阻塞的网络通信。 使用Boost.Asio编写网络程序时,首先需要包含头文件<boost/asio.hpp>。它提供了一些基本类和函数,如io_service、ip::tcp::socket、ip::tcp::acceptor等。 io_service类是Asio库中的核心类,负责管理所有的I/O事件。ip::tcp::socket类是Asio库中用于网络通信的套接字类,可以用于客户端和服务器端编程。ip::tcp::acceptor类是用于监听客户端连接的类。 基本使用方法是:创建一个io_service对象,在服务器端创建一个ip::tcp::acceptor对象,并绑定监听地址和端口;在客户端创建一个ip::tcp::socket对象,并连接到服务器;然后使用async_read()/async_write()函数进行异步读写。 另外还有一些重要的类,如ip::tcp::resolver、ip::tcp::endpoint、ip::address等,它们分别用于解析域名、表示网络地址和IP地址。 这是使用Boost.Asio编写网络程序的基本流程, 如果想详 ### 回答2: Boost是一个被广泛使用的C++库,其中的boost.asio模块提供了用于网络编程的功能。Boost.asio库是一个跨平台的网络编程库,提供了丰富的网络通信工具,包括TCP和UDP的异步通信、套接字操作、定时器、IO流等。 Boost.asio库基于回调机制和事件驱动模型,使用异步编程风格,并支持高并发性能。通过使用异步操作,可以同时处理多个客户端请求,而不会阻塞主线程。这使得开发者可以构建高效的网络应用程序,能够处理大量的并发连接。 使用Boost.asio进行网络编程的基本步骤是: 1. 创建一个io_service对象来处理所有的IO操作。 2. 创建一个socket对象,指定协议类型(如TCP或UDP)和绑定地址。 3. 使用异步操作(如异步读取和写入)处理数据传输。 4. 使用回调函数处理处理异步操作完成的事件。 Boost.asio还提供了其他一些功能,例如定时器、IO流、UDP组播等。可以使用定时器来创建周期性任务或者在特定时间点执行某个操作。IO流对于处理HTTP请求和响应非常有用,可以方便地进行数据读取和解析。UDP组播可以用于多播通信,特别适合在局域网内进行实时数据传输。 总之,Boost.asio是一个强大的网络编程库,为C++开发者提供了丰富的工具和功能,可以方便地实现高效的网络应用程序。无论是开发服务器、客户端还是其他网络应用,Boost.asio都是一个值得推荐的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值