在函数指针中传递给其他线程的对象 - 如何处理它
Object passed in function pointer to other thread - how is it handled?
想象一下这样的代码,它创建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;
}
字段 a 和 b 正确传递,字段 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();
}
相关文章:
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 处理除以零会导致<csignal>意外行为
- 是否可以在c++中处理字符串流中的各个元素
- 在简单的外壳中进行批处理处理