
boost
boost something
南城小金刚
明月照大江
展开
-
boost.asio异步调用使用智能指针
boost.asio中的异步async_*函数需要传入回调函数参数,如果回调函数使用lamda表达式,在’capture’列表中传入智能指针,智能指针会生效吗?在async_connect调用之前,我们创建一个shared_ptr对象,并以值传入的形式放到lamda的’caputer’列表中,最后发现shared_ptr在async_connect的异步回调函数完成后析构了其管理的对象,可见其是生效的。其实最好还是用uinque_ptr,但lamda中不支持move捕获。测试代码如下:class L原创 2021-02-20 08:50:49 · 582 阅读 · 0 评论 -
boost.asio的async_write_some存在的坑
boost.asio的async_write_some看起来很方便,但使用起来很复杂,主要有两个方面:async_write_some经常与io_context不在同一线程,async_write_some同一时刻只能由一个线程调用,需要加锁,同时需要与io_context所在线程的其他异步方法同步,如关闭sock的时机。当对方一直不读取缓冲区,就会造成本方的socket发送缓冲区爆满,此种情况需要怎样处理?第一种情况就需要根据业务情况加各种锁了。现在只讨论当对方一直不读缓冲区的情况。测试如下s原创 2021-02-19 11:39:10 · 4813 阅读 · 1 评论 -
boost.asio中socket异步关闭流程
boost.asio中的socket异步方法,需要检测std::error_code来关闭连接,那如何正常关闭tcp连接呢。下面的模拟测试中:1.server端在读取client端发送的第一个1024字节流后,关闭连接。2.client端在另一个线程发送第一个1024字节流后,sleep1秒,再发送第二个1024字节流。结果:1.server端在关闭socket后,其异步方法会检测到错误。2.client端的第二次发送也会检测到错误。所以通过正常的错误处理,两端可以及时地关闭tcp连接。可以得原创 2021-02-19 11:14:46 · 3161 阅读 · 0 评论 -
boost.asio的异步回调函数是否在同一线程中执行
boost.asio中有async_read_some,async_accept,async_write_some,async_connect这几个函数,那么他们的回调函数都在同一线程吗?如果io_context在单线程运行,那么是的,测试如下。class LIBTEST_BOOST_DLL TcpServer{public: typedef boost::asio::ip::tcp::socket tcp_socket_t; typedef boost::asio::ip::tcp::acc原创 2021-02-19 09:36:21 · 823 阅读 · 0 评论 -
c++ boost 加载文件到字符串
c++标准中没有一个api可以加载文件到string类型,网上都说的是先用ostringstream中转下,今发现了boost中有一个这样的api,用着挺好用,注意捕捉异常。#include<boost/filesystem.hpp>#include<iostream>using namespace std;string strRet;string path="/root/hello.txt";try { boost::filesystem::load_string原创 2021-01-26 14:05:24 · 677 阅读 · 0 评论 -
boost asio add event while asio.run() in another thread
当在一个线程中调用io_context.run()后,在另一个线程中添加事件,是线程安全的。这是在stackoverflow中找到的代码,原文如下void CalculateFib(std::size_t n);int main(){boost::asio::io_service io_service;boost::optionalboost::asio::io_service::work work = // ‘. 1boost::in_place(boost::ref(io_se原创 2021-01-26 13:35:20 · 199 阅读 · 0 评论