如何可靠地终止 Qt/C++ 中的线程?
How to reliably kill a thread in Qt/C++?
我正在使用 C++11、Qt 5.6(一旦 V-Play 支持,很快就会是 5.7)和 QML 制作桌面编程游戏。用户将能够编写任意代码来解决难题;但是,代码应该完全沙盒化,不会导致应用程序的其余部分出现问题。
所以我实例化了一个脚本引擎,我完全控制了它的环境,运行 玩家的代码通过它。我不会说什么脚本引擎,因为我不希望解决方案依赖引擎(另外,我可能支持多种语言)。当玩家点击 "Submit" 时,我 运行 异步执行脚本,以便游戏的其余部分仍然响应。
但这是我的问题:如果玩家的代码需要很长时间才能 运行 会怎样?或者更糟的是,如果这是一个无限循环怎么办? 玩家 会 在学习过程中犯错误,所以 "they shouldn't do that" 不会 此处为有效答案。
所以我就让玩家随意终止他们的代码,好吧。 但是我怎样才能做到这一点而不冒未定义行为、内存泄漏、崩溃或其他可能对游戏产生负面影响的事情的风险呢?
相关内容如下:
- 解决方案应该是多平台的。
- 解决方案应该不取决于我使用的脚本引擎。
- 我不会在线程之间传递数据,所以我不需要担心数据竞争。
QtConcurrent::run
returns不支持的QFuture
QFuture::cancel
。
您不能指望能够安全地杀死 C/C++ 线程。任何正在做任何有意义工作的线程都需要获取锁 and/or 分配内存来完成它的工作;杀死线程可能会留下一些永久持有的锁,或者永远不会释放的内存。根据详细信息,这可能会导致您的应用程序在许多脚本被终止后 运行 内存不足,或者如果主线程试图获取被终止的解释器线程持有的锁,则导致它完全锁定。
如果您需要能够中断 运行ning 脚本,您将需要选择专门允许此操作的脚本引擎。并非所有人都会;你需要避开那些不支持它的。
我正在使用 C++11、Qt 5.6(一旦 V-Play 支持,很快就会是 5.7)和 QML 制作桌面编程游戏。用户将能够编写任意代码来解决难题;但是,代码应该完全沙盒化,不会导致应用程序的其余部分出现问题。
所以我实例化了一个脚本引擎,我完全控制了它的环境,运行 玩家的代码通过它。我不会说什么脚本引擎,因为我不希望解决方案依赖引擎(另外,我可能支持多种语言)。当玩家点击 "Submit" 时,我 运行 异步执行脚本,以便游戏的其余部分仍然响应。
但这是我的问题:如果玩家的代码需要很长时间才能 运行 会怎样?或者更糟的是,如果这是一个无限循环怎么办? 玩家 会 在学习过程中犯错误,所以 "they shouldn't do that" 不会 此处为有效答案。
所以我就让玩家随意终止他们的代码,好吧。 但是我怎样才能做到这一点而不冒未定义行为、内存泄漏、崩溃或其他可能对游戏产生负面影响的事情的风险呢?
相关内容如下:
- 解决方案应该是多平台的。
- 解决方案应该不取决于我使用的脚本引擎。
- 我不会在线程之间传递数据,所以我不需要担心数据竞争。
QtConcurrent::run
returns不支持的QFuture
QFuture::cancel
。
您不能指望能够安全地杀死 C/C++ 线程。任何正在做任何有意义工作的线程都需要获取锁 and/or 分配内存来完成它的工作;杀死线程可能会留下一些永久持有的锁,或者永远不会释放的内存。根据详细信息,这可能会导致您的应用程序在许多脚本被终止后 运行 内存不足,或者如果主线程试图获取被终止的解释器线程持有的锁,则导致它完全锁定。
如果您需要能够中断 运行ning 脚本,您将需要选择专门允许此操作的脚本引擎。并非所有人都会;你需要避开那些不支持它的。