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

Object passed in function pointer to other thread - how is it handled?

本文关键字:何处理 处理 对象 指针 函数 线程 其他      更新时间:2023-10-16

想象一下这样的代码,它创建lambda函数并将其传递给其他线程执行(方法schedule_task_in_thread期望函子作为唯一的参数)。对象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->method() 报告的对象 o 与 do_something() 中的对象略有不同。我试图捕获所有{复制|默认|移动}{构造函数|赋值},但我没有看到它们被调用。

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

字段 ab 正确传递,字段 c 设置为 Integer(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();
}