C ++中的延迟执行策略

问题描述 投票:0回答:1

我有一个回调实现,其中一个未知的第三方调用我的代码中的函数指针。

但是,很多语言中的一个问题是在函数返回后触发代码。例如,当调用回调并且我必须删除调用对象(并且,在这种情况下,重新初始化它)时,从回调返回将导致异常。

假设我无法挂钩并且我不拥有/无法修改调用回调的代码,在函数返回后执行代码的最佳方法是什么?

我能想到这样做的唯一真正方法是设置某种状态机并让工作线程检查状态。但是,我预见到的问题是竞争条件,在重置回调返回和调用对象重置之间调用回调。

是否有任何我不知道的功能,或者这是实现这种结果的最有效方式?

return deferred-execution
1个回答
1
投票

它需要c ++ 11或更新版本。但这就是我要做的。您可以将其重写为使用函数指针,以便它可以在较旧的c ++版本上运行

#include <functional>
#include <iostream>

#define CONCACT_IMPL(x , y) x##y
#define CONCAT(x, y) CONCACT_IMPL(x, y)
#define deffered(x) auto CONCAT(__deffered, __COUNTER__)  = Defer(x);

struct Defer {
    Defer(std::function<void(void)> pFunc) : func(pFunc) {};
    std::function<void(void)> func;
    virtual ~Defer(){
        func();
    }
};

int main() {

    deffered([] () {
        std::cout << "deffered" << std::endl;
    });

    std::cout << "now" << std::endl;
}

输出 - >

now
deffered
© www.soinside.com 2019 - 2024. All rights reserved.