首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程事件调度

多线程事件调度
EN

Stack Overflow用户
提问于 2011-04-02 01:59:30
回答 3查看 2.7K关注 0票数 3

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

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

EN

回答 3

Stack Overflow用户

发布于 2011-04-02 02:36:50

以下是几个:

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

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

票数 3
EN

Stack Overflow用户

发布于 2011-04-02 02:57:34

创建一个新线程并经常销毁它并不是一个好主意。首先,您应该有一种方法来绑定它,这样它就不会消耗太多的内存(例如堆栈空间),或者因为线程在CPU上争夺时间而导致大量抢占发生。其次,您将浪费大量与创建新线程并将其撕毁相关的工作。(这取决于您的操作系统。一些开放源码软件可能有廉价的线程创建,而另一些则可能是昂贵的。)

听起来你想要实现的是一个工作队列。我在维基百科上找不到一篇很好的文章,但这篇文章已经接近了:线程池模式

我们可以花几个小时讨论如何实现这个问题,以及可以使用的不同并发队列算法。但是我们的想法是创建N个线程,这将耗尽一个队列,并对正在排队的项执行一些工作。通常,您还希望线程在队列中没有项的情况下等待信号量 --工作线程会减少这个信号量,而入队者会增加它。为了防止在工作线程繁忙时排队过多,从而占用过多的资源,还可以让它们等待“可用队列时隙的数目”信号量,该信号量由排队者减少,而工作线程则增加。这些只是例子,细节由你来决定。您还需要一种方法来告诉线程停止等待工作。

票数 2
EN

Stack Overflow用户

发布于 2011-04-02 02:35:13

我的2美分:取决于主机应用程序生成的事件的数量和速率,我看到的主要问题是性能。创建和销毁线程具有较高的性能--我假设每个一旦生成的线程都不需要与其他线程共享任何资源,因此没有争用。如果在CPU的单个核心上分配了所有线程,并且没有负载平衡,则可以轻松地重载一个CPU,并将其他CPU卸载到多核系统上。我将考虑一些线程关联+负载平衡策略。

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

对于LUA线程中的内存泄漏也要非常小心:如果事件频繁发生,并且频繁地创建/销毁线程,则会很快占用主机内存;)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5520607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档