如果我们有多个线程上运行同一个io_context上下文,那么向这个io_context上下文提交的task会随即出现在这些线程中的某一个,在随机的时间点运行。
但是,在某些情况下,我们提交的一系列task可能是有依赖关系,需要先后执行的,那么这种情况下,直接向io_context上下文提交就无法满足需求了。
此时,就需要用strand这个特殊的执行器了,代码如下:
#include <boost/asio.hpp>
#include <string>
#include <thread>
#include <iostream>
#include <cstdio>
#include <syncstream>
using namespace boost;
asio::io_service ctx{}; // asio上下文
std::allocator<void> alloc;
asio::io_service::strand strand_(ctx); // 用于序列化handler执行的strand
int main()
{
auto wg = asio::make_work_guard(ctx);
std::thread tmp_thread1([&ctx] { ctx.run(); std::osyncstream(std::cout) << "thread1 exit" << std::endl; });
std::thread tmp_thread2([&ctx] { ctx.run(); std::osyncstream(std::cout) << "thread2 exit" << std::endl; });
std::thread tmp_thread3([&ctx] { ctx.run(); std::osyncstream(std::cout) << "thread3 exit" << std::endl; });
std::thread tmp_thread4([&ctx] { ctx.run(); std::osyncstream(std::cout) << "thread4 exit" << std::endl; });
char buf[256] = {0};
for (int i = 0; i < 10; i++) {
sprintf(buf, "task id: %d run!", i);
std::string tmpstr(buf);
ctx.get_executor().post(
//strand_.post(
[tmpstr] {
std::osyncstream(std::cout) << tmpstr.c_str() << std::endl;
}, alloc);
}
std::this_thread::sleep_for(std::chrono::seconds(20));
ctx.stop();
}