Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+;非线程异步IO简介+;?_C++_Multithreading_Asynchronous_Io - Fatal编程技术网

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

C++ C+;非线程异步IO简介+;?,c++,multithreading,asynchronous,io,C++,Multithreading,Asynchronous,Io,我在一个由“UI开发者”(美国)和“C++开发者”(他们)组成的桌面应用程序团队中工作。C++ DEVs负责获取我们在UI中显示的所有数据,所以他们做所有的IO、数据库访问、Web调用等。 最近我们遇到了一些严重的性能问题,IO阻塞了UI线程。当然,解决方案是使IO异步。但是C++开发者坚持这是可能的,因为我们生成了一个新的线程,这是我们所知道的非常昂贵的。 我从Node.js等中知道异步IO不需要涉及线程。我知道Win32,大概还有Mac,确实有一个事件循环。但是,我不知道C++中的解决方案是

我在一个由“UI开发者”(美国)和“C++开发者”(他们)组成的桌面应用程序团队中工作。C++ DEVs负责获取我们在UI中显示的所有数据,所以他们做所有的IO、数据库访问、Web调用等。 最近我们遇到了一些严重的性能问题,IO阻塞了UI线程。当然,解决方案是使IO异步。但是C++开发者坚持这是可能的,因为我们生成了一个新的线程,这是我们所知道的非常昂贵的。 我从Node.js等中知道异步IO不需要涉及线程。我知道Win32,大概还有Mac,确实有一个事件循环。但是,我不知道C++中的解决方案是如何做异步非线程IO。(可能是节点下面的libuv?)


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

。他们有一个和几个。它是跨平台的。

“产生一个新线程,我们知道这非常昂贵”。我经常看到这种观点。我不得不说,我不知道它“非常昂贵”。这在很大程度上取决于您的特定用例,并且“应该避免”额外线程的情况比应该包含它们的一般情况小得多。我们的应用程序需要读取用户电子书库中每个文件的属性,在某些情况下,可以超过1500个文件。1500个线程是不可接受的。但是,您可以在一个线程中完成。1500个项目是一个非常小的工作队列。是的,一个后台线程和一个UI线程是可以接受的。但是C++ DEVS告诉我们每个异步操作都需要自己的线程。我知道,如果在后台线程中使用异步非线程IO,则情况并非如此,这就是我提出此问题的原因。您的“C++开发人员”在欺骗您:p我不能概括并说这是真的,但我不明白为什么每个IO需要一个线程。听起来他们好像把自己设计成了一个角落,没必要。您可以使用WM_定时器消息,并使用
boost::asio::io_service::poll_one()
运行异步任务调度器。这个页面说它确实没有自己创建任何线程,但我想您至少需要一个线程作为
Proactor
来调用
io\u service::run()
,以便处理完成的读/写操作。编辑:或者你按照@Chad说的做:P@ArunMuAsio是围绕套接字设计的,但是proactor可以用于任何您想要的异步作业。它不必是网络代码。我在许多项目中将它用作通用异步任务提供程序。@ArunMu您可以在完成处理程序中执行任何您想要的操作,只需将您的“作业”对象发布到
io\u服务
。现在,这并不是说它将神奇地不为您阻塞(函数仍然可以阻塞,如果您只有一个线程,那么这可能是一个问题)。将包装作业(作为执行处理程序)与
deadline\u timer
对象结合使用可以非常灵活。