2013-10-15 72 views
5

根據lua 5.1手冊,lua_xmove在不同線程的堆棧之間移動屬於同一個Lua狀態的值。但是,我不小心碰巧使用它來跨越不同的Lua狀態移動值,它似乎工作正常!是否有其他API將值從一個Lua狀態移動到另一個(在5.1中),還是可以使用lua_xmovelua_xmove在不同的lua狀態之間

+1

的方式之一,移動/複製的Lua Lua的States'之間不同的'在不同的線程對象: http://stackoverflow.com/a/9573063/1150918 – Kamiccolo

+1

我注意到了* LuaLanes *代碼,我正在看到從一個狀態複製到另一個狀態的代碼。謝謝。 – vyom

回答

5

Lua將垃圾收集數據存儲在全局狀態中。因此,如果您將GC或字符串對象跨狀態移動,您可能會混淆垃圾回收器並創建懸掛引用。

所以,雖然它看起來像是有效的,但它可能會在稍後很容易引起問題。

僅供參考,請參閱this mailing list thread開發人員討論此確切問題。

注意lua_xmove不檢查全局狀態是相同的:

api_check(from, G(from) == G(to)); 
+2

請注意,'api_check'根據編譯時間選項更改行爲。參見手冊的第3章(5.2中的第4章)和luaconf.h。我相信Lua的正常發佈版本不支持API檢查。 – RBerteig

+0

api檢查的目的很明確,'from'應該等於'to'。 – doug65536

+1

什麼?不,'from'不應該等於'to',否則會導致無操作。事實上,全局狀態(在狀態樹中調用'lua_newstate()'所導致的狀態必須與兩個參數相同,換句話說,'to'和'from'都是由可能是空的)''lua_newthread()'調用的鏈調用一些初始狀態'L'。 – BadZen