boost::asio::io_service::post 是原子的吗?
Is boost::asio::io_service::post atomic?
给定 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()
可能会在子线程开始 运行ning 之前完成,因此在发布任何内容之前。
如果你想避免它需要 运行() 直到满足特定的停止条件(例如从发布的处理程序发出信号)。 io_service::work
也可以提供帮助。
给定 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()
可能会在子线程开始 运行ning 之前完成,因此在发布任何内容之前。
如果你想避免它需要 运行() 直到满足特定的停止条件(例如从发布的处理程序发出信号)。 io_service::work
也可以提供帮助。