【发布时间】: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 需要一个线程。听起来他们已经把自己设计到了一个角落。
标签: c++ multithreading asynchronous io