C ++ / QT安全终止阻塞线程

时间:2018-07-28 20:44:24

标签: c++ multithreading qt boost

我正在创建一个应用程序,该应用程序使用C ++ / Qt 5.6和Boost编写的现有代码库,使用API​​的功能与服务器进行通信。编写代码的方式是,与服务器的任何通信均由在工作对象中运行的API函数完成。工作对象在QThread()中运行,并使用moveToThread移动。

我的问题是,我需要能够立即停止线程并在网络连接断开的情况下断开连接。但是,线程在将数据发送到服务器时会阻塞。如果我尝试通过quit() or wait()停止线程,该请求仍然会到达服务器,这是不希望的。该API也没有提供任何方法来取消任何正在进行的请求。

我当前的解决方案是终止线程,并在网络连接断开时销毁它拥有的工作对象。然后,当连接到服务器时,我将创建一个新的QThread和新的worker对象。

我知道应该避免terminate()或任何形式的线程即时终止,例如瘟疫,但我认为它似乎可以正常工作。

在QThread中运行的worker对象通过std::shared_ptr使用std::make_shared作为其成员。

还有内存泄漏/损坏的机会吗?

除此之外,由于我在方法中创建了QThread,因此我收到来自QT的警告:

QObject: cannot create children for a parent that is in a different thread

尽管有此警告,我的代码仍然可以运行,但是我有疑问。忽略此警告是否安全?忽视这一点有什么风险/后果?

用QT的中断检查点散布服务器连接代码/使用boost::interruption_point而不是调用终止将其重写成boost,是否更安全?即

sendData();
if (QThread::currentThread()->isInterruptionRequested())
{
 return;
}
sendData();
if (QThread::currentThread()->isInterruptionRequested())
{
 return;
}
...

非常感谢您。

0 个答案:

没有答案
相关问题