如何在C++20协同程序中使用boost::asio/beast时使用自定义分配器



我正试图找到一种方法,在使用带有asio::use_awaitable和C++20协同程序的boost::beast时挂接自定义分配器。给定此功能草图:

asio::awaitable<void> process_request(asio::ip::tcp::socket sock) 
{                                                                           
// Prepare the beast http buffer and request stuff using the custom allocator
...  

fmt::print(stdout, "Readingn");                                        
co_await http::async_read(sock, buffer, req, asio::use_awaitable); 
fmt::print(stdout, "Done readingn"); 
// Prepare the beast http buffer and response stuff using the custom allocator
...         
                                                       
fmt::print(stdout, "Writingn");                                        
co_await http::async_write(sock, res, asio::use_awaitable);            
fmt::print(stdout, "Done!nn");                    
}

以及覆盖全局运算符new/delete,我对分配进行了一些跟踪,并将大部分分配挂接到自定义分配器。以下是我的问题:

  1. 如何在使用use_awaitable时为读/写处理程序挂接自定义分配器?我看到在读取打印之间有288字节的分配,在写入打印之间有408字节的分配。我想这些是asio内部为处理程序所做的分配。我在这里读过关于如何为回调hadnler提供自定义分配器的文章,但我不知道如何为这种完成令牌提供自定义分配器。Asio似乎提供了一种将分配器与use_future挂钩而不与use_awaitable挂钩的方法
  2. 如何将自定义分配器提供给asio机器,使其用于协程框架分配?据我所知,我可以为协程promise类型覆盖运算符new/delete,但这种类型隐藏在asio机制中。除此之外,我无法在打印中看到上述协同程序的分配。我在上面的函数中有1024字节的堆栈缓冲区,在我的打印中没有看到这么大的分配

谢谢。

我问了自己同样的问题(只是出于好奇,所以我自己没有测试以下内容(,并在(ASIO创建者(对原始ASIO存储库中的github问题的一些评论中找到了答案。注释的示例代码可以在下面找到。

awaitable<void> foo()
{
my_pre_allocatated_storage_type my_storage;
my_custom_allocator my_alloc(my_storage);
...
co_await my_operation(/*...*/, bind_allocator(my_alloc, use_awaitable));
}

但是使用的bind_allocator调用是在24上添加的。2022年2月,目前没有出现在Boost.Asio(Boost1.78.0(中。如果你想通过Boost使用此功能,你可能只需要等待一段时间。

最新更新