gpt4 book ai didi

c++ - Lambda 捕获这个和长时间运行的函数

转载 作者:行者123 更新时间:2023-11-30 03:30:17 24 4
gpt4 key购买 nike

我有一个函数需要很长时间才能运行,但幸运的是它是异步运行的。我想获取此函数调用的结果并将其设置为类实例的私有(private)变量。看起来很简单:

// Exists in some other library.
void LongRunningAsync(std::function<void(int)> callback) {
sleep(10);
callback(5);
}

class A {
public:
void Do() {
auto lambda = [this](int val) {
// Some processing...
var_ = val;
};
LongRunningAsync(lambda);
}

private:
var_;
};

int main() {
A* a = new A;
a->Do();
// Wait for LongRunningAsync to finish.
sleep(20);
return 0;
}

问题是将以下行添加到 main,就在评论之前:

delete a;

现在当 LongRunningAsync 调用回调时,它将尝试修改已删除实例(即 UB)的成员变量。

有没有办法挽救这种方法?我最近了解到以下解决方案:

void LongRunningAsync(std::function<void(int)> callback) {
sleep(10);
callback(5);
}

class A : public std::enable_shared_from_this<A> {
public:
void Do() {
std::weak_ptr<A> weak = shared_from_this();
auto lambda = [weak](int val) {
auto shared = weak.lock();
if (!shared) return;
// Some processing...
shared->var_ = val;
};
LongRunningAsync(lambda);
}

private:
var_;
};

int main() {
auto a = std::make_shared<A>();
a->Do();
// Wait for LongRunningAsync to finish.
sleep(20);
return 0;
}

但它需要将所有 A 变量更改为shared_ptr。有没有侵入性较小的方法来完成这项工作?

最佳答案

一个可能的解决方案是将您需要的状态封装到一个 shared_ptr 成员变量中,然后通过值将其捕获到异步运行的闭包中。

类似下面的内容

class A : public std::enable_shared_from_this<A> {
public:
void Do() {
auto lambda = [member_shared_state](int val) {
member_shared_state->var_ = val;
};
LongRunningAsync(lambda);
}
....
};

关于c++ - Lambda 捕获这个和长时间运行的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45107930/

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