boost::asio::io_service::p ost 是原子的吗?

Is boost::asio::io_service::post atomic?

本文关键字:原子的 ost service asio io boost      更新时间:2023-10-16

给定一个boost::asio::io_service io在启动io.run()的线程以外的线程上调用io.post(...)是否安全?

例如:

boost::asio::io_service io;
void f()
{
/* do something */
io.post(&f);
}
void g()
{
/* do something else */
io.post(&g)
}
int main()
{
std::thread t1(&f);
std::thread t2(&g);
io.run();
t1.join();
t2.join();
return 0;
}

我假设io_service使用某种内部数据结构(例如队列(,并且发布会改变此数据结构(例如推送到队列(。 我担心的是数据结构可能是也可能不是线程安全的。

我四处搜索,但一直无法找到这个问题的直接答案,尽管我所看到的一切似乎都表明post()线程安全的(即原子的(。 有人可以验证吗?

io_service::post是thread_safe,从不同的线程发布就好了(通常需要在多线程asio环境中执行此操作(。

但是,您的示例具有一些争用条件:

io.run()可能会在子线程开始运行之前完成,因此在发布任何内容之前完成。 如果你想避免这种情况,它需要运行((,直到满足特定的停止条件(例如,从发布的处理程序发出信号(。io_service::work也可以提供帮助。