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

Jes*_*eTG 2 c++ qt multithreading cancellation

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

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

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

所以我只是让玩家随意终止他们的代码,很好. 但是,如何在不冒未定义的行为,内存泄漏,崩溃或其他可能对游戏产生负面影响的事情的情况下做到这一点?

相关的是以下内容:

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

dus*_*uff 5

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

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