boost :: asio :: io_service :: post原子了吗?

时间:2018-08-15 13:42:25

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

鉴于boost::asio::io_service io是否可以安全地在启动io.post(...)的线程之外的其他线程上调用io.run()

例如:

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()是线程安全的(即原子的),但我一直在搜索并无法找到该问题的直接答案。有人可以验证吗?

1 个答案:

答案 0 :(得分:1)

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

但是您的示例有一些竞争条件:

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