#include <iostream>
#include <syncstream>
#include <thread>
#include <coroutine>
#include <boost/asio.hpp>
#include <boost/asio/experimental/as_single.hpp>
#include <boost/bind/bind.hpp>
#include <boost/thread/thread.hpp>
inline std::osyncstream tout() {
auto hash = std::hash<std::thread::id>{}(std::this_thread::get_id());
return std::osyncstream(std::cout) << "T" << hash << " ";
}
namespace asio = boost::asio;
asio::awaitable<void> mainCo(asio::io_context &appIO, asio::io_context &prodIO) {
// the thread should also change when using the IO contexts directly.
auto astrand = asio::io_context::strand{appIO};
auto pstrand = asio::io_context::strand{prodIO};
tout() << "MC on APPIO" << std::endl;
co_await asio::post(pstrand, asio::use_awaitable);
tout() << …Run Code Online (Sandbox Code Playgroud) 在以下示例中,计时器与 io_context 执行器关联。但随后,处理程序被告知在线程池中执行。原因是,因为处理程序实际上执行的是阻塞代码,而我不想阻塞runio_context的函数。
但文档指出
处理程序仅由当前正在为 io_context 调用 run()、run_one()、run_for()、run_until()、poll() 或 poll_one() 的任何重载的线程调用。
如代码所示,处理程序由 thread_pool 在run. 这种行为定义明确吗?它也适用于套接字吗?
#include <boost/asio.hpp>
#include <iostream>
int main() {
using namespace boost::asio;
thread_pool tp(4);
io_context ioc;
deadline_timer dt(ioc, boost::posix_time::milliseconds(500));
dt.async_wait(bind_executor(tp, [&](boost::system::error_code){
std::cout << "running in tp: " << tp.get_executor().running_in_this_thread() << std::endl;
std::cout << "running in ioc: " << ioc.get_executor().running_in_this_thread() << std::endl;
exit(0);
}));
auto wg = make_work_guard(ioc);
ioc.run();
}
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)running in tp: 1 running in ioc: 0
神箭链接。
自最新版本的 boost 以来,asio 推出了新的执行器并提供了asio::strand<Executor>. 所以现在完全可以使用asio::strand<asio::io_context::executor_type>来代替io_context::strand. 但它们不能互换使用。
using Yield = asio::yield_context;
using boost::system::error_code;
int Func(Yield yield) {
error_code ec;
asio::detail::async_result_init<Yield, void(error_code, int)> init(yield[ec]);
std::thread th(std::bind(Process, init.handler));
int result = init.result.get(); // <--- yield at here
return result;
}
Run Code Online (Sandbox Code Playgroud)
如何实现,Process以便Func在Func最初产生的链的上下文中恢复?