我正在开发一个C++应用程序,它将使用Lua脚本进行外部附加。加载项完全是事件驱动的;在加载脚本时,处理程序将在主机应用程序中注册,并且主机在事件发生时调用处理程序。
我想要做的是让每个Lua脚本在自己的线程中运行,以防止脚本锁定主机应用程序。我目前的目的是分拆一个新线程来执行Lua代码,并允许线程在代码完成后自行终止。新线程作为多线程事件分派的一种形式,其潜在的缺陷是什么?
发布于 2011-04-02 02:36:50
以下是几个:
一般来说,给事件驱动的API一个新线程来运行,我觉得这是一个错误的决定。在引发事件之前,线程没有什么可做的,为什么要运行线程呢?考虑为所有附加组件生成一个线程,并从该线程管理所有事件传播。它将更容易实现,当bug出现时,您将有一个战斗的机会。
发布于 2011-04-02 02:57:34
创建一个新线程并经常销毁它并不是一个好主意。首先,您应该有一种方法来绑定它,这样它就不会消耗太多的内存(例如堆栈空间),或者因为线程在CPU上争夺时间而导致大量抢占发生。其次,您将浪费大量与创建新线程并将其撕毁相关的工作。(这取决于您的操作系统。一些开放源码软件可能有廉价的线程创建,而另一些则可能是昂贵的。)
听起来你想要实现的是一个工作队列。我在维基百科上找不到一篇很好的文章,但这篇文章已经接近了:线程池模式。
我们可以花几个小时讨论如何实现这个问题,以及可以使用的不同并发队列算法。但是我们的想法是创建N个线程,这将耗尽一个队列,并对正在排队的项执行一些工作。通常,您还希望线程在队列中没有项的情况下等待信号量 --工作线程会减少这个信号量,而入队者会增加它。为了防止在工作线程繁忙时排队过多,从而占用过多的资源,还可以让它们等待“可用队列时隙的数目”信号量,该信号量由排队者减少,而工作线程则增加。这些只是例子,细节由你来决定。您还需要一种方法来告诉线程停止等待工作。
发布于 2011-04-02 02:35:13
我的2美分:取决于主机应用程序生成的事件的数量和速率,我看到的主要问题是性能。创建和销毁线程具有较高的性能--我假设每个一旦生成的线程都不需要与其他线程共享任何资源,因此没有争用。如果在CPU的单个核心上分配了所有线程,并且没有负载平衡,则可以轻松地重载一个CPU,并将其他CPU卸载到多核系统上。我将考虑一些线程关联+负载平衡策略。
其他问题可能是资源读取内存,每个LUA线程将消耗多少内存?
对于LUA线程中的内存泄漏也要非常小心:如果事件频繁发生,并且频繁地创建/销毁线程,则会很快占用主机内存;)
https://stackoverflow.com/questions/5520607
复制相似问题