2012-10-09 33 views
3

我的應用程序使用的Lua多線程環境全球互斥工作。它實現的是這樣的:Lua中操作,在mutitheaded環境

  1. 線程鎖定互斥,
  2. 呼叫lua_newthread
  3. coroutine
  4. coroutine
  5. 運行lua_resume執行一些初始化解鎖互斥

lua_lock/unlock未實現,當lua時GC停止與coroutine一起工作。

我的問題是,如果初始化過程不需要任何全局Lua結構體,我可以不鎖定地執行步驟2和3嗎?如果coroutine不需要全局變量,我可以執行所有這些過程嗎?

在什麼情況下,我通常可以使用Lua函數而不鎖定?

回答

1

在什麼情況下我通常可以使用Lua函數而不鎖定?

在相同的Lua狀態(或從相同的源Lua狀態派生的線程)?

無。

Lua是線程安全的,因爲單獨的Lua狀態實例可以並行執行。當您在同一個Lua狀態實例中調用任意 Lua API函數從兩個不同的線程時,絕對沒有線程安全保證。

您不能在某些同步機制之外執行任何步驟2,3或4,以防止同時訪問相同的狀態。不要緊,如果它只是創建一個新的線程(分配內存)或一些「初始化過程」(它可能會分配內存)。即使是不分配內存的東西也是不允許的。

Lua沒有提供關於Lua狀態下線程安全的保證。

0

的Lua並不保證線程安全,如果你想使用 Lua的狀態單獨 OS線程,而lua_lock/unlock。如果你想使用多線程環境,你需要爲每個操作系統線程使用單獨的狀態。

看看一些多線程解決方案,例如https://github.com/effil/effil

+0

請透露你的關係。 –