以前一直没弄多线程的东西,这几天试了以下,结果弄出很多问题出来,记录下。
如何删除线程:
为了可以动态调节线程的数量,我把所有的线程都放在一个vector中,当需要的数量大于vector.count()的时候则创建并加入线程;当需要减少线程数的时候则通过如下代码实现:
QThread* thd = vector.last();
delete thd;
vector.pop_back();
普通用法估计没有什么问题,但在需要动态调节数量并且这些线程都共用一些东西的时候就有很大的问题了。
delete thd;并没有让线程结束,如果是在windows下可以说只是将其操作的HANDLE给删除掉了,并没有停止代码块在系统线程队列的运行,所以其实我们的线程还是运行当中的,并且这样处理了之后就真的无法停止线程了。
这样做的坏处有2个:
1.访问一些对象(例如线程共享)的时候提示unhandle exception;
2.调用emit signal之后sender()被提示unhandle exception;
所以正确的做法应该是先disconnect(),然后在terminate(),最后delete掉它。
在线程共享数据的时候如果没有特殊要求应该首选通过信号传递指针值,当然别忘了处理完之后delete掉。
没有细看源代码不知道QThread的析构函数在怎么写的,不过从这里可以看出析构函数中并没有停止线程执行的相关操作,小小的失望了下。