首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::asio::io_service::post是原子的吗?

boost::asio::io_service::post是原子的吗?
EN

Stack Overflow用户
提问于 2018-08-15 13:42:24
回答 1查看 721关注 0票数 2

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

例如:

代码语言:javascript
复制
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()是线程安全的(即原子的)。有人能证实一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-15 16:11:10

io_service::post是thread_safe,来自不同线程的发布很好(通常需要在多线程的asio环境中这样做)。

但是,您的示例具有一定的竞赛条件:

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51859895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档