我最近发现并且爱上了jQuery中使用的Deferred / Promise模式。它只是封装了很多异步用例,包括精彩的链接,过滤能力,我不敢相信我错过了这么长时间。
我刚刚完成了重构我的AS3代码以使用优秀的CodeCatalyst / promise-as3库(https://github.com/CodeCatalyst/promise-as3),因此开始考虑回到我的C ++代码并看看如何在那里实现模式
在我自己开始编码之前,我检查过它是否已经完成,并发现std::future
/ std::promise
(以及提升等效物),但它们非常重(它们似乎使用真正的线程等,并有一个沉重的模板语法)。
所以,我的问题是:是否存在deferred / Promise模式的轻量级纯C ++实现,jQuery风格?
参考文献:
答案 0 :(得分:8)
我不确定你所使用的解决方案有多轻量级,但std::async简化了未来/承诺对的设置,并允许调用者决定是否由另一个线程异步执行工作,或在同一个线程中延迟执行。在任何情况下,调用者都不必进行任何显式的线程管理。
答案 1 :(得分:6)
有几个原因让我觉得你要求的东西在C ++中几乎是不可能的。
首先,为了使用C++11's new lambda syntax进行内联函数声明(相当于JavaScript中的等效内容非常简单而且非常轻松),您只需要使用模板来使用它们。
其次,与JavaScript不同,没有自动的UI线程供您停放计时器/完成队列,因此您几乎不得不求助于创建一个线程池来监视已准备好的任务。执行下一步。
当您说“纯C ++”和“轻量级”(并且隐式无线)时,您还有什么想法?
答案 2 :(得分:0)
您可以使用合作多任务。我在我的应用程序中使用了一个。我遇到的唯一麻烦是,如果我将lambda存储在列表中,那么捕获的变量就会被破坏<>并在以后称呼它。我还没有找到解决方案,但我确信应该可以做到这一点。
答案 3 :(得分:0)
我知道这个问题已经过时了,不过我认为值得一提的还有 rili ,这可能会完全符合您的要求。
有一些示例和文档。
就像生命中的(liblw)一样,它主要依赖于模板。该库的一个主要特性是A + Promises实现 - 包括Then(单参数和双参数),Catch和Finally。
链接:
答案 4 :(得分:0)
只需使用Facebook的Folly库:https://github.com/facebook/folly/blob/master/folly/docs/Futures.md
Boost.Thread和C ++ 17(甚至还不支持组合器)提供的功能不及Folly。 在Folly中,您甚至可以收到成功的结果,而不必像用户Oz的答案中所示的那样尝试。 您可以通过使用线程池执行程序(以前是Wangle的一部分,现在是Folly的一部分)甚至是内联执行程序来限制线程数。 没有模板,您将无法在C ++中获得成功,而且它们可以确保类型安全,这是一件好事。
请记住,您必须对期货使用移动语义,但可以使用folly :: SharedPromise从一个承诺创建多个期货。
您还可以查看以下列表:https://en.wikipedia.org/wiki/Futures_and_promises#List_of_implementations(“基于非标准库的期货实现:”)。
答案 5 :(得分:0)
这是另一个模仿JavaScript Promise的C ++ Promise库。它设计轻巧,因此可以用于例如I / O密集型异步软件,同时具有JS承诺的许多优点。它已经在一个非常受欢迎的项目中使用了多年,因此经过了实践证明: https://github.com/alxvasilev/cpp-promise