按值捕获std::函数

capture std::function by value

本文关键字:函数 std      更新时间:2023-10-16

我使用以下代码:

struct WorkData
{
    std::string name;
    std::function<void(std::string)> Callback;
    WorkData(){};
    WorkData(const WorkData& other)
    {
        name = other.name;
        Callback = std::ref(other.Callback);
    }
};
WorkData data; // this is the data to pass to queue_task() function bellow
data.Callback = std::bind(&ResultProcessor::Handler, resProc, std::placeholders::_1);
template <typename Functor>
void queue_task(Functor& fn, WorkData& workData )
{
    group.run([&fn, workData](){
          workData.Callback("resultComming"); // runtime ERROR- access violation
    });
}

queue_task函数队列在另一个线程上异步完成工作(通过从上面调用group.run(lambda))。我遇到的问题是,当我试图调用workData.Callback().时,我遇到了访问冲突

我之所以在group.run()中复制workData,是因为我想按值捕获workData,这样当group.run)lambda执行时,它就有一个调用queue_task()时状态的副本。我希望workData.Callback()将在第行传递的对象实例上执行:

data.Callback = std::bind(&ResultProcessor::Handler, resProc, std::placeholders::_1);

编辑:当崩溃线被称为时,上面的resProc是活动的(未被破坏)

在副本构造函数中使用std::ref意味着保留对旧WorkDataCallback成员的引用,而不是副本。您希望Callback = other.Callback制作一个副本以避免访问冲突(可能是在释放旧回调后访问它)。为了在std::function中保留对resProc的引用,您需要在对std::bind的调用中使用std::ref(resProc)

相关文章: