对象在函数指针中传递给其他线程 - 如何处理?

时间:2017-01-12 14:02:44

标签: c++ lambda functor

想象一下这样的代码,它创建lambda函数并将其传递给其他要执行的线程(方法 schedule_task_in_thread 期望 Functor 作为唯一参数)。对象 o 到底发生了什么?是否在执行方法之前创建了临时副本? wait()可确保呼叫阻止。

 #define INVOKE_IN_MYTHREAD(method_name, ...) \
                return schedule_task_in_thread( [&](){ return mythread->method_name(__VA_ARGS__); }).wait().

    void do_something( MyObject o ){
       INVOKE_IN_MYTHREAD( method, o );
    }

问题是, mythread->方法()报告的对象o与 do_something()中的对象略有不同。我试图抓住所有{copy | default | move} {constructor | assignments},但我没有看到它们被调用。

class MyObject{
  uint32_t a;
  std::string b;
  CryptoPP::Integer c;
}

字段 a b 正确传递,字段 c 设置为整数(0)。 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您的lambda是捕获该方法的所有参数的引用,并且这些引用仅在调用线程位于do_something的主体中时才有效。

如果您按值获取lambda捕获,则会有一个副本。

比你的宏更安全

template <typename Method, typename ... Args>
void invoke_in_mythread(Method method, Args ... args)
{
    schedule_task_in_thread( [=](){ return mythread->method(std::forward<Args...>(args)); }).wait();
}