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 - 工作線程減少此信號量,並且隊列將增加它。爲了防止入隊者在工作線程繁忙時入列太多,並因此佔用太多資源,還可以讓隊列等待「可用隊列位數」信號量,入隊者遞減並且工作者線程遞增。這些僅僅是例子,細節取決於你。您還需要一種方法來告訴線程停止等待工作。