如何在Qt / C ++中可靠地杀死一个线程?

时间:2016-07-15 00:31:34

标签: c++ multithreading qt cancellation

我正在制作一个桌面编程游戏,包括C ++ 11,Qt 5.6(一旦V-Play支持它,很快就会有5.7)和QML。用户将能够编写任意代码来解决难题;但是,代码应该完全沙箱化,并且会导致应用程序其余部分出现问题。

所以我实例化一个脚本引擎,它的环境我完全控制并通过它运行播放器的代码。我不会说什么脚本引擎,因为我不希望解决方案依赖于引擎(另外,我可能支持多种语言)。当玩家点击“提交”时,我会异步运行脚本,以便游戏的其余部分仍然响应。

但是这是我的问题:如果玩家的代码需要很长时间才能运行会怎么样?或者更糟糕的是,如果它是一个无限循环怎么办?玩家在他们学习时犯错误,所以“他们不应该这样做” a这里有效答案。

所以我会让玩家随意终止他们的代码,很好。 但是我怎么能这样做而不会冒未定义的行为,内存泄漏,崩溃或其他可能对游戏产生负面影响的事情?

相关性如下:

  • 解决方案应该是多平台的。
  • 解决方案应该取决于我正在使用的脚本引擎。
  • 我不是在线程之间传递数据,所以我不需要担心数据争用。
  • QtConcurrent::run返回QFuture支持QFuture::cancel

1 个答案:

答案 0 :(得分:5)

您不能依赖能够安全地杀死C / C ++线程。任何进行任何有意义工作的线程都需要获取锁和/或分配内存来完成其工作;杀死线程可能会永久保留一些锁,或者永远不会释放内存。根据细节,这可能会导致应用程序在许多脚本被杀死后耗尽内存,或者如果主线程尝试获取被解雇的解释器线程持有的锁,则会导致应用程序完全锁定。

如果您需要能够中断正在运行的脚本,则需要选择特别允许此操作的脚本引擎。不是所有人都会;你需要避免那些不支持它的人。