C++ 的非线程异步 IO 简介?

Posted

技术标签:

【中文标题】C++ 的非线程异步 IO 简介?【英文标题】:Intro to non-threaded async IO for C++? 【发布时间】:2012-01-21 06:57:10 【问题描述】:

我在一个由“UI 开发人员”(我们)和“C++ 开发人员”(他们)组成的桌面应用团队工作。 C++ 开发人员负责获取我们在 UI 中显示的所有数据,因此他们执行所有 IO、数据库访问、Web 调用等。

最近我们遇到了一些严重的性能问题,因为 IO 阻塞了 UI 线程。当然,解决这个问题的方法是让 IO 异步。但是 C++ 开发人员坚持这只能通过产生一个新线程来实现,我们知道这非常昂贵。

我从 Node.js 等处了解到异步 IO 不需要涉及线程。我知道 Win32,可能还有 Mac,确实有一个事件循环。但是,我不知道在 C++ 领域流行什么解决方案来执行异步非线程 IO。 (也许那个 libuv 是 node 的基础?)。

谁能指出一些流行的库,或者更好的教程文章,以便我们可以将这个概念介绍给我们的 C++ 开发人员?跨平台(PC 和 Mac)的奖励积分。如果有异步非线程数据库解决方案,则会获得更多奖励积分,因为我相信我们对 SQLite 的使用是我们许多问题的根源。

【问题讨论】:

产生一个新线程,我们知道这非常昂贵”。我经常看到这种观点。而且我不得不说,我不知道它“非常昂贵”。它高度依赖于您的特定用例,“应该避免”额外线程的情况比应该包含它们的一般情况要小得多。 我们的应用程序需要读取用户电子书库中每个文件的属性,在某些情况下可能超过 1500 个文件。 1500 个线程是不可接受的。 但是,您可以在一个线程中执行此操作。 1500 个项目是一个非常小的工作队列。 是的,一个后台线程和一个 UI 线程是完全可以接受的。但是 C++ 开发人员告诉我们每个异步操作都需要自己的线程。如果您在后台线程中使用异步非线程 IO,我知道这是不正确的,这就是我问这个问题的原因。 你的“C++ 开发者”在骗你。 :p 我不能一概而论地说,但我不明白为什么每个 IO 需要一个线程。听起来他们已经把自己设计到了一个角落。 【参考方案1】:

Boost Asynchronous I/O (asio)。他们有一个excellent tutorial 和几个examples。它是跨平台的。

【讨论】:

没必要。您可以使用 WM_TIMER 消息并使用 boost::asio::io_service::poll_one() 运行异步任务调度程序。 boost.org/doc/libs/1_48_0/doc/html/boost_asio/overview/core/… boost.org/doc/libs/1_48_0/doc/html/boost_asio/overview/core/… 这个页面说它确实没有自己创建任何线程,但我猜你需要至少 1 个线程作为 Proactor 来调用 io_service::run() 以便处理完成的读/写。编辑:或者你按照@Chad 所说的去做:P @ArunMu Boost.Asio 是围绕套接字设计的,但前摄器可用于您想要的任何异步作业。它不必是网络代码。我已经将它用作许多项目的通用异步任务提供程序。 @ArunMu 你可以在你的完成处理程序中做任何你想做的事情,只需post你的“工作”对象到io_service。现在,这并不是说它不会神奇地为您阻塞(函数仍然可以阻塞,并且如果您只有一个线程可能会成为问题)。将包装作业(作为执行处理程序)与 deadline_timer 对象结合使用可以非常灵活。

以上是关于C++ 的非线程异步 IO 简介?的主要内容,如果未能解决你的问题,请参考以下文章

node 简介

并发与并行同步与异步,线程安全的实现

并发与并行同步与异步,线程安全的实现

并发与并行同步与异步,线程安全的实现

并发与并行同步与异步,线程安全的实现

C++ - 几个 Boost.Asio 相关问题