c++ - boost::asio::io_service::post 是原子的吗?

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

最佳答案

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

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

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

关于c++ - boost::asio::io_service::post 是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51859895/

相关文章:

java - 线程如何能够访问应该是 block 的同步块(synchronized block)?

c++ - 如何将 boost.Asio 与 MJPEG 一起使用?

c++ - 如何实现与平台无关的异步写入文件?

c++ - 确定 CE 上的 XAML 解析错误位置

java - JOptionPane.showMessageDialog 线程安全吗?

c++ - qt5结合QGroupBox和QPushButton

c# - 对静态集合的线程安全访问

c++ - boost.asio 和当前的网络 TS 最大的区别是什么?

c++ - 跨动态链接库的模板静态类

c++ - 如何使用 C++ 运行批处理文件?