多线程事件调度

时间:2011-04-02 01:59:30

标签: c++ multithreading event-driven-design event-dispatching

我正在开发一个将Lua脚本用于外部附加组件的C ++应用程序。附加组件完全由事件驱动;加载脚本时,处理程序在宿主应用程序中注册,主机在事件发生时调用处理程序。

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

3 个答案:

答案 0 :(得分:3)

以下是一些:

  1. 除非你采取一些措施,否则你无法控制线程的生命周期(它们可以无限期地运行)或它们消耗的资源(CPU等)
  2. 线程之间的消息传递和对常用数据的同步访问将更难实现
  3. 如果你期望有大量的附加组件,那么为每个附加组件创建一个线程的开销可能太大了
  4. 一般来说,给事件驱动的 API提供一个新线程可以让我觉得这是一个糟糕的决定。为什么线程在事件被引发之前没有任何事情要运行?考虑为所有加载项生成一个线程,并管理该线程的所有事件传播。它将更容易实现,当错误来临时,你将有一个战斗机会。

答案 1 :(得分:2)

创建一个新线程并经常销毁它并不是一个好主意。首先,你应该有一种方法来限制它,以便它不会消耗太多的内存(例如,想想堆栈空间),或者到达发生大量抢占的地步,因为线程正在争夺时间CPU。其次,您将浪费大量与创建新线程并将其拆除相关的工作。 (这取决于您的操作系统。某些操作系统可能具有廉价的线程创建,而其他操作系统可能会很昂贵。)

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

人们可以谈论如何实现这一点,以及可以使用的不同并发队列算法。但是这个想法是你创建了N个线程,这些线程会耗尽一个队列,并做一些工作来响应入队的项目。通常,您还希望线程等待semaphore,而队列中没有项目 - 工作线程会减少此信号量,并且enqueuer会递增它。为了防止入队者在工作线程繁忙时占用过多而因此占用太多资源,您还可以让他们等待“可用的队列插槽数”信号量,其中enqueuer递减并且工作线程递增。这些只是示例,详细信息由您决定。您还需要一种方法来告诉线程停止等待工作。

答案 2 :(得分:1)

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

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

要非常小心LUA线程中的内存泄漏:如果事件频繁且经常创建/销毁线程而留下内存,则可以很快消耗主机内存;)