关于使用C ++协程的问题

问题描述 投票:1回答:1

我正在使用liburing对传入的C ++协程进行实验。

我是JavaScript开发人员,正在尝试实现Promise.all之类的功能>

我的第一次尝试

template <typename T>
task<std::vector<T>> taskAll1(std::vector<task<T>> list) {
    std::vector<T> result;
    result.reserve(list.size());
    for (auto&& t : list) {
        result.push_back(co_await t);
    }
    co_return result;
}

taskgor_task修改而成。我主要将task::promise_type::initial_suspend return suspend_never设置为默认启动协程。

用法:

task::promise_type::initial_suspend

该代码按预期工作。但是,如果我重新排列suspend_never的顺序,例如让// async_delay: https://github.com/CarterLi/liburing-http-demo/blob/12af992d0d87a721bbe67bb67aee8e4b0e965114/async_coro.hpp#L68 // It waits some seconds asynchronously and then prints the number of seconds it waits. task<bool> start() { // TODO: less verbose code? std::vector<task<int>> vec; vec.emplace_back(async_delay(1)); vec.emplace_back(async_delay(2)); vec.emplace_back(async_delay(3)); co_await taskAll<int>(std::move(vec)); co_return true; } emplace_back之前,则代码仍然运行,但在程序结束时冻结。我知道这是因为任务async_delay(2)在等待之前就已解决,但我不知道如何解决。

第二次尝试,我想做的是将下面的JS代码转换为C ++

async_delay(1)

C ++代码

async_delay(1)

该代码立即崩溃。异步代码真的很难调试,我放弃了。

完整代码/** @param {Promise<any>[]} list */ function taskAll(list) { return new Promise(resolve => { const result = new Array(list.length); let left = list.length; list.forEach((p, i) => { p.then(x => { result[i] = x; left--; if (!left) resolve(result); }) }); }); } ,请提供帮助。

我正在尝试对传入的C ++协程进行解放。我是JavaScript开发人员,正在尝试实现Promise.all之类的功能。我的第一次尝试模板task <:...>

c++ asynchronous coroutine
1个回答
0
投票

对于第二次尝试,我发现我忘记分配由lambda表达式返回的任务,这使该任务在lambda函数返回后立即被破坏。

© www.soinside.com 2019 - 2024. All rights reserved.