C中安全异步回调的模式
对于在对象上执行安全异步回调,以下代码有哪些替代方法?
class MyClass : public std::enable_shared_from_this<MyClass> { private: void fetchResults() { std::weak_ptr<MyClass> weakSelf = shared_from_this(); m_service.getResultAsync( /* args... */,/* Callback */ [weakSelf](Result r) { auto self = weakSelf.lock(); if (self) { self->workFinishedWithResult(std::move(r)); } }); } void workFinishedWithResult(Result r) { // ... continue workflow } std::shared_ptr<Service> m_service; }; 我想避免使用enable_shared_from_this(并避免m_service的客户端需要它用于一个非常常见的用例),但是如果没有它,似乎很难在回调内部延长MyClass的生命周期. 在lambda中捕获它并尝试在MyClass的析构函数中取消注册,或者在回调完成之前阻止MyClass被破坏是导致竞争,死锁和简单性丢失的路径.我几乎可以肯定捕捉’这个’是不安全的. 似乎MyClass要求shared_ptr< Service>如果它能够管理或延长自己的生命周期(通过enable_shared_from_this),它只能保证它仍然有效,因为它不知道回调将存在多长时间.否则,它必须由拥有MyClass的任何人负责,或者谁知道服务和MyClass的生命周期来处理这个问题,但这一切都变得非常容易出错并且不切实际. 似乎唯一可行的解??决方案是: >将enable_shared_from_this与“捕获弱”模式一起使用(如上面的代码所示) 有什么替代方案?或者在执行异步C时使用enable_shared_from_t这是不可避免的? 解决方法
你正在寻找的确切事情是std :: future< T> :: then().它在C 11中不存在,但是boost :: future提供了它.
但是,在一般情况下,调用者有责任确保服务和MyClass实例的存活时间足够长,尽管如果该方法采用对服务的拥有引用也是可以接受的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |