3

我正在开发一个 C++ 应用程序,它将使用 Lua 脚本作为外部插件。附加组件完全是事件驱动的;加载脚本时向主机应用程序注册处理程序,并且主机在事件发生时调用处理程序。

我想要做的是让每个 Lua 脚本在自己的线程中运行,以防止脚本锁定主机应用程序。我目前的意图是分拆一个新线程来执行 Lua 代码,并在代码完成后允许线程自行终止。将新线程作为多线程事件分派的一种形式存在哪些潜在缺陷?

4

3 回答 3

3

这里有几个:

  1. 除非您采取一些措施,否则您无法控制线程的生命周期(它们可以无限期地保持运行)或它们消耗的资源(CPU 等)
  2. 线程之间的消息传递和对常用数据的同步访问将更难实现
  3. 如果您期待大量附加组件,为每个附加组件创建线程的开销可能太大

一般来说,给事件驱动的API 一个新的线程来运行在我看来是一个错误的决定。为什么线程在引发事件之前无事可做?考虑为所有附加组件生成一个线程,并管理来自该线程的所有事件传播。这将更容易实施,当错误出现时,您将有一个战斗的机会。

于 2011-04-02T02:36:50.630 回答
2

创建一个新线程并经常销毁它并不是一个好主意。一方面,您应该有一种方法来限制它,这样它就不会消耗太多内存(例如,想想堆栈空间),或者因为线程正在竞争时间而导致发生大量抢占。中央处理器。其次,您将浪费大量与创建新线程和拆除它们相关的工作。(这取决于你的操作系统。一些操作系统可能有廉价的线程创建,而其他操作系统可能会很昂贵。)

听起来您正在寻求实现的是工作队列。我找不到关于此的好的 Wikipedia 文章,但这很接近:线程池模式

人们可能会持续数小时讨论如何实现这一点,以及可以使用的不同并发队列算法。但是这个想法是你创建 N 个线程,这些线程将耗尽一个队列,并做一些工作来响应排队的项目。通常,您还希望线程在队列中没有项目时等待信号量- 工作线程减少此信号量,而入队者将增加它。为了防止入队者在工作线程繁忙时过多地入队并因此占用过多资源,您还可以让他们等待“可用的队列槽数”信号量,入队者递减而工作线程递增。这些只是示例,细节取决于您。你'

于 2011-04-02T02:57:34.803 回答
1

我的 2 美分:取决于主机应用程序生成的事件的数量和速率,我能看到的主要问题是性能方面。创建和销毁线程有成本[性能方面] 我假设每个线程一旦产生就不需要与其他线程共享任何资源,因此不存在争用。如果所有线程都分配在 CPU 的单个内核上并且没有负载平衡,则您可以轻松地使一个 CPU 过载而使其他 [在多核系统上] 卸载。我会考虑一些线程亲和性+负载平衡策略。

其他问题可能是资源 [读取内存] 每个 LUA 线程将消耗多少内存?

也要非常小心 LUA 线程中的内存泄漏:如果事件频繁并且线程被频繁地创建/销毁而导致内存泄漏,您可以很快消耗您的主机内存;)

于 2011-04-02T02:35:13.040 回答