给定一个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()是线程安全的(即原子的)。有人能证实一下吗?
发布于 2018-08-15 16:11:10
io_service::post是thread_safe,来自不同线程的发布很好(通常需要在多线程的asio环境中这样做)。
但是,您的示例具有一定的竞赛条件:
io.run()可能在子线程开始运行之前完成,因此在发布任何内容之前完成。如果要避免这种情况,则需要运行(),直到满足特定的停止条件(例如,从发布的处理程序发出信号)。io_service::work也可以在这方面提供帮助。
https://stackoverflow.com/questions/51859895
复制相似问题