2010-06-10 399 views
12

lua_lock和lua_unlock有什麼意義?lua_lock和lua_unlock的用途?

下意味着是很重要的:

LUA_API void lua_gettable (lua_State *L, int idx) { 
    StkId t; 
    lua_lock(L); 
    t = index2adr(L, idx); 
    api_checkvalidindex(L, t); 
    luaV_gettable(L, t, L->top - 1, L->top - 1); 
    lua_unlock(L); 
} 


LUA_API void lua_getfield (lua_State *L, int idx, const char *k) { 
    StkId t; 
    TValue key; 
    lua_lock(L); 
    t = index2adr(L, idx); 
    api_checkvalidindex(L, t); 
    setsvalue(L, &key, luaS_new(L, k)); 
    luaV_gettable(L, t, &key, L->top); 
    api_incr_top(L); 
    lua_unlock(L); 
} 

下意味着什麼都不做:

#define lua_lock(L)  ((void) 0) 
#define lua_unlock(L) ((void) 0) 

請指教。

回答

19

如果您將Lua移植到另一個平臺,您可以「允許」使用自己的定義覆蓋lua_lock;而這個定義本質上應該是一個互斥體,以禁止在相同的Lua對象上進行交叉線程操作。從本質上講,實現時,它應該類似於Python的全局解釋器鎖(GIL)。

由於vanilla Lua是100%ANSI-C,並且在單線程中運行,因此它被定義爲在香草Lua中禁用,因此不需要任何鎖定機制來實現。然而,開發人員選擇將鎖定語句放在那裏,以便那些移植Lua並在解釋器中實現線程化的人員。

來源:

+0

如果這必須是互斥保護的其他archs,爲什麼它在x86 64位的Ubuntu沒有必要? [我正在運行的系統] – anon 2010-06-10 01:02:28

+0

如果您允許從多個線程爲同一個'lua_State'調用Lua API,那麼您必須*定義合適的'lua_lock'和'lua_unlock'。默認構建不會這樣做,因爲它會損害最常見的單線程案例的性能,所以您不能在多個線程中使用單個'lua_State'。 – RBerteig 2010-06-10 22:59:50

+3

如果你實現多個線程擁有你自己的,你仍然需要小心。如果兩個線程試圖同時迭代一個表,lua_lock和lua_unlock將不夠用。 – 2012-03-30 02:54:49