gpt4 book ai didi

c++ - Boost.Asio在该帖子之后被调用处理程序吗?

转载 作者:行者123 更新时间:2023-12-03 07:15:40 25 4
gpt4 key购买 nike

我需要将lamda发布到io_context,但我想保证处理程序仅在post()调用之后才执行。遵循一个简化的代码段:

auto l = [] { cout << "hello lambda"; };

int f(asio::io_context& io) {
io.post(l);
}

int main() {
asio::io_context io;
thread th{[&io] { io.run(); };

f(io);
cout << "hello main";

th.join();
return 0;
}
是否保证“您好主!”在“hello lamda”之前被称为alayws吗?

最佳答案

PS I have taken the liberty of threating the question as "Is it guarantee that "hello main!" is alayws called before "hello lamda"?" because "I want to have the guarantee that the handler is executed only after the post()" is trivially true. That's because handlers are guaranteed to only be executed on a thread currently running run()/poll() on an execution context


克服一些语法错误,缺少的返回语句 this仍然具有注释中描述的竞争条件:
运行io服务的线程可能会在 post有机会运行之前返回。
有两种典型的方法可以解决此问题:
使用工作人员
Live On Coliru
boost::asio::io_context io;
auto work = make_work_guard(io);
std::thread th{[&io] { io.run(); }};

f(io);
std::cout << "hello main\n";

work.reset();
th.join();
使用 thread_pool最近的Boost版本引入了功能齐全的线程池:
Live On Coliru
boost::asio::thread_pool io(1); // one thread

f(io.get_executor());
std::cout << "hello main\n";

io.join();
订购任务:单一服务线程
最直接的方法是简单地按顺序发布它们:
post(io, [] { std::cout << "hello main\n"; });
f(io.get_executor());
这意味着 hello main将始终出现在从 f发布的lambda之前。
订购:多个服务线程
如果您有一个真正的游泳池:
boost::asio::thread_pool io(10);
您可以使用链:
auto strand = make_strand(io);
post(strand, [] { std::cout << "hello main\n"; });
f(strand);
这仍然保证以相同方式对任务进行排序。
Live On Coliru
版画
hello main
hello lambda

关于c++ - Boost.Asio在该帖子之后被调用处理程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64496850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com