Lambda 捕获此函数和长时间运行的函数
Lambda capturing this and long-running function
我有一个需要很长时间才能运行的函数,但幸运的是它是异步运行的。 我想获取此函数调用的结果并将其设置为类实例的私有变量。 似乎很容易:
// 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);
}
....
};
这是一个基于 Curious 方法的解决方案,但这并不强制我将所有指向A
对象的指针更改为shared_ptr
:
// Exists in some other library.
void LongRunningAsync(std::function<void(int)> callback) {
sleep(10);
callback(5);
}
class A {
public:
A() : var_(std::make_shared<int>()) {}
void Do() {
std::weak_ptr<int> weak = var_;
auto lambda = [weak](int val) {
auto shared = weak.lock();
if (!shared) {
return;
}
// Some processing...
*shared = val;
};
LongRunningAsync(lambda);
}
private:
std::shared_ptr<int> var_;
};
int main() {
A* a = new A;
a->Do();
delete a;
// Wait for LongRunningAsync to finish.
sleep(20);
return 0;
}
相关文章:
- 使用Boost Interprocess创建托管共享内存需要很长时间
- SFML RenderWindow打开窗口需要很长时间
- 函数的时间复杂度是多少?
- 如何计算此排序函数的时间复杂度?
- 如何计算函数的时间复杂度?
- Kafka C++客户端需要很长时间才能收到消息
- 给定使用 C++ 或 C,我如何测量在 linux 下进行线程切换需要多长时间?可能吗?
- asio::read() 需要很长时间,使用 asio::write 没有问题
- 在确定函数的时间复杂度时需要帮助
- 将线程锁定很长时间
- 正在等待在非阻塞文件描述符上长时间运行ioctl
- 用于测量重载运算符和成员函数的时间的函数
- 即使长时间等待,C++线程也不会加入
- 连接() 在连接被拒绝时长时间挂起
- C++ 测量重复调用的函数的时间
- Lambda 捕获此函数和长时间运行的函数
- C++程序在函数返回上花费了很长时间
- boost::asio::io_service析构函数运行很长时间
- 单独线程中的 GetDC 函数需要很长时间才能返回
- 哪些函数需要很长时间才能执行?