多线程对象性命期提问
多线程对象生命期提问
我是刚入行的小白,真心求教:
问题描述:
class Father
{
Father(){ /*构造函数*/ };
~Father(){ /*析构函数*/ };
print(/*打印*/);
};;
void thread_work(Father& a)
{
a.print(); //####提问:这里为什么会调用析构?
}
int main()
{
std::thread th(thread_work);
th.join();
}
补充:改为 void thread_work(Father* a); 就可以了,
原型是客户端发数据,因为调用析构,所以服务端接收到2个网络指令了,拜托大神解疑啦,感谢感谢!
还有 能不能说下这属于哪方面知识呢?
------解决思路----------------------
你线程运行的函数是怎么传递进去的呢?代码里没看到
------解决思路----------------------
代码貌似不完整
------解决思路----------------------
《Windows核心编程》
《深入解析Windows操作系统-Windows Internals》
------解决思路----------------------
引用的话由编译器根据引用计数来判断什么时候释放对象
当它发现a在调用a.print后没有再使用了,就可能触发释放操作
而对于指针,它没办法进行这样的判断
------解决思路----------------------
这个我看了汇编,他是在check stack的时调用的析构,编译器的世界太难懂。
------解决思路----------------------
std::thread mythread(rhread_work,fafa);
=>
std::thread mythread(rhread_work,std::ref(fafa));
你原来的代码传的是副本(即使函数签名是引用,建立std::thread本身的时候传进去的就是拷贝,函数参数引用的是那个拷贝)。等thread结束了当然一个析构。
我是刚入行的小白,真心求教:
问题描述:
class Father
{
Father(){ /*构造函数*/ };
~Father(){ /*析构函数*/ };
print(/*打印*/);
};;
void thread_work(Father& a)
{
a.print(); //####提问:这里为什么会调用析构?
}
int main()
{
std::thread th(thread_work);
th.join();
}
补充:改为 void thread_work(Father* a); 就可以了,
原型是客户端发数据,因为调用析构,所以服务端接收到2个网络指令了,拜托大神解疑啦,感谢感谢!
还有 能不能说下这属于哪方面知识呢?
------解决思路----------------------
你线程运行的函数是怎么传递进去的呢?代码里没看到
------解决思路----------------------
代码貌似不完整
------解决思路----------------------
《Windows核心编程》
《深入解析Windows操作系统-Windows Internals》
------解决思路----------------------
引用的话由编译器根据引用计数来判断什么时候释放对象
当它发现a在调用a.print后没有再使用了,就可能触发释放操作
而对于指针,它没办法进行这样的判断
------解决思路----------------------
这个我看了汇编,他是在check stack的时调用的析构,编译器的世界太难懂。
------解决思路----------------------
std::thread mythread(rhread_work,fafa);
=>
std::thread mythread(rhread_work,std::ref(fafa));
你原来的代码传的是副本(即使函数签名是引用,建立std::thread本身的时候传进去的就是拷贝,函数参数引用的是那个拷贝)。等thread结束了当然一个析构。