gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:30:38 25 4
gpt4 key购买 nike

我正在用 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让协程默认启动。

用法:

// 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) 出现在 async_delay(1) 之前,代码仍然运行但是在程序结束时卡住。我知道这是因为任务 async_delay(1) 在等待之前已解决,但我不知道如何修复它。

第二次尝试,我想做的是把下面的JS代码翻译成C++

/** @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++代码

// completion: https://github.com/CarterLi/liburing-http-demo/blob/12af992d0d87a721bbe67bb67aee8e4b0e965114/task.hpp#L78
// It's like JS Promise and can be awaited directly without calling an async function
template <typename T>
task<std::vector<T>> taskAll(std::vector<task<T>> list) {
std::vector<T> result(list.size());
size_t left = list.size();
completion<std::vector<T>> promise;
for (size_t i=0; i<list.size(); ++i) {
[&, i]() mutable -> task<bool> {
result[i] = co_await list[i];
left--;
if (!left) promise.resolve(std::move(result));
co_return true;
}();
}
co_await promise;
co_return result;
}

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

完整代码 can be found in Github ,请帮忙。

最佳答案

第二次尝试时,我发现我忘记了分配 lambda 表达式返回的任务,这使得任务在 lambda 函数返回后立即销毁。

关于c++ - 关于使用C++协程的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58769571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com