加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C中安全异步回调的模式

发布时间:2020-12-16 07:10:46 所属栏目:百科 来源:网络整理
导读:对于在对象上执行安全异步回调,以下代码有哪些替代方法? class MyClass : public std::enable_shared_from_thisMyClass{private: void fetchResults() { std::weak_ptrMyClass weakSelf = shared_from_this(); m_service.getResultAsync( /* args... */,/*
对于在对象上执行安全异步回调,以下代码有哪些替代方法?

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与“捕获弱”模式一起使用(如上面的代码所示)
>让MyClass获得服务&因此,呼叫者有责任确保服务超过它.
>使用静态方法/函数作为回调并按值传递它所需的所有内容(问题是有时你确实想要将控制权传递回MyClass并且你有同样的问题).

有什么替代方案?或者在执行异步C时使用enable_shared_from_t这是不可避免的?

解决方法

你正在寻找的确切事情是std :: future< T> :: then().它在C 11中不存在,但是boost :: future提供了它.

但是,在一般情况下,调用者有责任确保服务和MyClass实例的存活时间足够长,尽管如果该方法采用对服务的拥有引用也是可以接受的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读