【问题标题】:Is boost::asio::io_service::post atomic?boost::asio::io_service::post 是原子的吗?
【发布时间】:2019-01-22 09:37:52
【问题描述】:

给定一个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() 是线程安全的(即原子的)。有人可以验证吗?

【问题讨论】:

    标签: c++ thread-safety boost-asio atomic


    【解决方案1】:

    io_service::post 是线程安全的,从不同线程发布就可以了(通常需要在多线程 asio 环境中进行)。

    但是你的例子有一点竞争条件:

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

    【讨论】:

    • 太棒了。另外,感谢您在我的代码中发现错误。
    猜你喜欢
    • 2012-11-26
    • 2011-06-16
    • 1970-01-01
    • 2013-08-07
    • 2017-09-17
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多