0

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

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

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

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

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

4

1 回答 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
于 2018-01-04T17:15:54.973 回答