2
我使用下面的代码:(从上面通过调用group.run(拉姆达))捕获的std ::功能通过价值
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功能队列的工作被另一个线程异步完成。我遇到的问题是在尝试调用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,否则我最终会对ResultProcessor的另一个实例调用workData.Callback(“resultComming”) – Ghita 2012-04-01 19:59:39
在这种情况下,您需要在ResultProcessor中使用'std :: ref',而不是函数对象本身。也就是说,在你的最后一个代码块中,你应该有'std :: ref(resProc)',然后在你的拷贝构造函数中使用'std :: function'的一个真实副本。 – 2012-04-01 20:13:44
ResultProcessor实例与std :: function一起传输,作为queue_task()中的WorkData的一部分接口 –
Ghita
2012-04-01 20:16:20