c - 杀死 SDL 2 线程 (C)

标签 c multithreading sdl

SDL 2 具有创建和管理线程的良好功能,并且是跨平台的。 SDL 1 具有终止这些线程的功能,但 SDL 2 不再具有此功能,正如他们在其 wiki 上提到的那样。

我过去常常使用 OS native 函数(Windows 线程和 Linux pthread)编写线程,我可以这样做。

我知道你应该对你的线程进行编程,这样你就永远不必杀死它们,而且我相当擅长编写线程,但现在我正在开发一个项目,该项目将允许用户编写我将从中运行的脚本代码在线程中,以便它们可以并行运行。

如果这些脚本运行时间超过 10 秒,它们将被视为挂起。如果用户想要退出应用程序并且线程很忙,他们将不得不等待这些线程完成,如果脚本不好,可能永远不会结束。

在那种情况下,我认为终止线程是唯一/最好的选择,通知用户脚本有问题。

为什么 SDL 2 不再支持这一点,是否有解决方法?

最佳答案

当然,首先想到的应该是:真的有必要吗。不能添加要求线程正确退出并清理的信号吗?

线程应该始终有一种自行停止或监视退出请求的机制。

但是,当您的项目拥有所有这些但允许用户为这些线程编写他们自己的代码时,例如通过 Lua 脚本,您总是会让人通过添加无限循环(可能不是故意的)来搞砸事情。在这种情况下,在空闲时间观察事件将无济于事,因为不会有空闲时间。

所以在我看来,SDL 没有线程终止功能是一个错误的决定。这就像说汽车不应该有安全气囊一样,因为人们希望用户采取预防措施,不要撞到东西上。与此同时,即使被告知不要撞车,司机还是挽救了很多生命。

我见过的最好的答案是以平台相关的方式自己做。 SDL 提供了一种获取线程 ID 的方法:SDL_GetThreadID .此 ID 与操作系统为线程提供的 ID 相同,然后可用于通过特定于平台的函数终止线程:

#ifdef _WIN32
TerminateThread(SDL_GetThreadID(t), 0);
#end
#ifdef __linux
pthread_kill(SDL_GetThreadID(t), 0);
#endif

我不知道 SDL 支持的其他平台,因此您当然也应该确保研究他们的方式。我想 SDL 也使用 Mac OS 的 pthread 实现,所以它也可能在那里工作。当我过去编写自己的线程代码时,它就这样做了。

我正在研究建议的线程中断。如果这证明有帮助,我也会在这里发布。

另一种可能的解决方案当然是可以要求使外部代码成为可能的代码停止执行。我不认为 Lua 提供这样的东西,但如果我找到它,我肯定会喜欢它。

编辑:对于 Lua,可以设置一个触发每 N 条指令的调试钩子(Hook)。这样,应该可以在 Lua 执行外部代码时检查退出请求。我一定会研究这个(主要是检查性能),这样杀死线程肯定会成为最后的手段。参见 lua_sethook .

关于c - 杀死 SDL 2 线程 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57218692/

相关文章:

C 违约问题

c - 打印具有相同值的两个字符串文字给出相同的地址

c# - 实现一个线程池,它可以在 C++ 中调用具有多个参数的函数

c# - 线程被中止 C#

c++ - 特定方向的二维运动

c++ - 任何可用于将 SDL 库添加到 Visual Studio 2012 的教程?

c - 在 Shell 脚本或 Perl 脚本中对单词进行排序,然后对包含数字和字符的句子进行排序

将 POSIX 整数 errno 转换为编译时常量

java - 用 Executor 替换 BlockingQueue + 守护线程

c++ - 用于将文件中的字符串读入 3D 数组的 For 循环