C++中的延迟/承诺模式

0pizxfdo  于 2023-02-17  发布在  其他
关注(0)|答案(8)|浏览(120)

我最近发现并爱上了jQuery中使用的Deferred/Promise模式,它封装了如此多的异步用例,包括奇妙的链接、过滤能力,我不敢相信我错过了它这么久。
我刚刚完成了AS 3代码的重构,以使用优秀的CodeCatalyst/promise-as 3库(https://github.com/CodeCatalyst/promise-as3),因此开始考虑回到C代码,看看如何在那里实现该模式。
在我自己开始编码之前,我检查了一下以前是否有人做过,发现了std::future/std::promise(和Boost等价物),但它们非常重(它们似乎使用真实的的线程等,并有一个沉重的模板语法)。
所以,我的问题是:是否有轻量级的、纯C
实现的延迟/承诺模式(jQuery风格)?
参考文献:

jm2pwxwz

jm2pwxwz1#

很抱歉扮演亡灵巫师,但我也对在C++中使用A+风格的承诺非常感兴趣,并花了数年时间寻找实现它的最佳方法。我最终成功了,你可以看到我的here实现。
用法非常简单,但是大量使用了模板和模板元编程。下面是一个例子:

Promise<int> promise;

promise.future().then([](int i){
    std::cout << "i = " << i << std::endl;
    return "foobar";
}).then([](const std::string& str){
    std::cout << "str = " << str << std::endl;
});

promise.resolve(10);

这将打印输出:

i = 10
str = foobar
pbpqsu0x

pbpqsu0x2#

我不确定你所追求的解决方案有多轻量级,但是std::async极大地简化了future/promise对的设置,并允许调用者决定工作是由另一个线程异步执行,还是在同一个线程中延迟执行,在任何情况下,调用者都不必做任何显式的线程管理。

f87krz0w

f87krz0w3#

有几个原因我认为你所要求的在C中几乎是不可能的。
首先,为了使用C++11's new lambda syntax进行内联函数声明(在JavaScript中,它的等价物是微不足道的,非常简单),您几乎必须使用模板来使用它们。
其次,与JavaScript不同,没有自动UI线程供您放置计时器/完成队列,因此您几乎必须创建一个线程池来监视准备执行下一步的任务。
当您说“纯C
”和“轻量级”(以及隐式无线程)时,您还想到了什么?

oalqel3c

oalqel3c4#

你可以使用一个协作式多任务处理器。我在我的应用程序中使用了一个。我遇到的唯一问题是,如果我在list〈〉中存储一个lambda并稍后调用它,捕获的变量会被破坏。我仍然没有找到解决方案,但我非常确定这应该是可能的。

hsvhsicv

hsvhsicv5#

我知道这个问题是老问题了,但是我想值得一提的还有rili,它可能实现了你想要的东西。
有一些示例和文档。
和lifewanted(liblw)一样,它也是基于模板的。这个库的一个主要特性是A+ Promises实现-包括Then(单参数和双参数),Catch和Finally。
链接:

i7uaboj4

i7uaboj46#

这是另一个模仿JavaScript promise的C++ promise库。它被设计成轻量级的,所以它可以被使用,例如I/O密集型的异步软件,同时拥有JS promise所拥有的许多好东西。它已经在一个非常流行的项目中使用了很多年,所以它是经过实践证明的:https://github.com/alxvasilev/cpp-promise

sf6xfgos

sf6xfgos7#

只需使用Facebook的愚蠢图书馆:https://github.com/facebook/folly/blob/master/folly/docs/Futures.md
线程与C17(甚至还不支持组合子)提供的功能不如Folly。在Folly中,你甚至可以收到成功的结果,而不是像用户Oz的答案中显示的那样尝试。你可以使用线程池执行器来限制线程的数量(这是以前旺格的一部分,但现在是Folly的一部分)或者甚至是一个内联执行器。没有模板,你在C中不会走得很远,它们确保了类型安全,这是一件好事。
请记住,您必须对future使用move语义,但是您可以使用一个fooly::SharedPromise从一个承诺创建多个future。
您还可以查看以下列表:https://en.wikipedia.org/wiki/Futures_and_promises#List_of_implementations(“基于非标准库的future实现:“)。

zpqajqem

zpqajqem8#

对C20使用类似JavaScript的Promises。它依赖于C20协程,支持ES6等待/异步语义,非常重要的是,它支持“move”,这样你就可以为asio这样的框架编写 Package 器(例如,因为asio::ip::tcp::socket不能被复制)。
链接:https://github.com/virgil382/JSLikePromise

相关问题