3

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

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

+0

什么样的事件?服务器,GUI或实时控制? – Potatoswatter 2011-04-02 02:33:10

+0

您的应用程序与这些附件相比有多强大? – 2011-04-02 02:39:28

+0

主机是连接到服务器的客户端。服务器将事件分派给客户端,而客户端又将事件分派给附加组件。 – 2011-04-02 02:46:01

回答

1

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

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

要非常小心,在LUA线程以及内存泄漏:如果事件频繁,创建线程/常破坏离开leacked内存,你可以很很快消耗你的主机内存;)

+0

好点。我最初认为它类似于Web服务器为传入客户端连接生成线程,但它可能不像我第一次想到的那么相似。 – 2011-04-02 02:51:02

3

这里有几个:

  1. 除非你采取一些步骤,以这个效果,你是不是在线程的生命周期(他们可以保持无限期运行)或者资源,他们消耗的控制(CPU等),线程之间
  2. 消息并且同步访问常用数据将很难实现plement
  3. 如果你期待大量的附加组件,创建线程为每一个可能太大

一般而言的开销,给事件驱动 API的一个新的线程来运行打击我是一个糟糕的决定。为什么线程在没有任何事情要做时才会运行,直到事件发生?考虑为所有附加组件产生一个线程,并管理该线程中的所有事件传播。这将非常容易实施,当错误来临时,你将有一个战斗机会。

+0

也许我没有说清楚,但是线程只会在事件被调度的地方创建。正如在其他回复中指出的那样,这可能会降低sytsem资源,而不是您建议使用单个线程进行分派。 – 2011-04-02 02:49:24

2

创建一个新线程并频繁销毁并不是一个好主意。首先,你应该有一种方法来限制它,以便它不会消耗太多内存(比如思考堆栈空间),或者到达很多先发制人的地步,因为线程正在争夺时间CPU。其次,你会浪费大量的工作来创建新的线程并将其拆分。 (这取决于你的操作系统,有些操作系统可能有便宜的线程创建,其他的可能会很贵。)

这听起来像你想要实现的是一个工作队列。我找不到一篇好的维基百科文章,但这很接近:Thread pool pattern

可以继续讨论如何实现这一点,以及可以使用的不同并发队列算法。但是这个想法是,你创建了N个线程,这将排出一个队列,并做出一些响应项目入队的工作。通常,您还希望线程在队列中没有项目的情况下等待semaphore - 工作线程减少此信号量,并且队列将增加它。为了防止入队者在工作线程繁忙时入列太多,并因此占用太多资源,还可以让队列等待“可用队列位数”信号量,入队者递减并且工作者线程递增。这些仅仅是例子,细节取决于你。您还需要一种方法来告诉线程停止等待工作。