2010-06-10 7 views
12

Was ist der Punkt von lua_lock und lua_unlock?Zweck von lua_lock und lua_unlock?

Im Folgenden bedeutet, es ist wichtig:

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); 
} 

Im Folgenden bedeutet es nichts tut:

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

Bitte aufklären.

Antwort

19

Wenn Sie Lua auf eine andere Plattform portieren, können Sie "lua_lock" mit Ihrer eigenen Definition überschreiben; und diese Definition sollte im Wesentlichen ein Mutex sein, um Cross-Thread-Operationen auf denselben Lua-Objekten zu verbieten. Im Wesentlichen sollte es, wenn es implementiert wird, ähnlich wie Pythons Global Interpreter Lock (GIL) funktionieren.

Es ist zu einem No-Op in Vanille Lua definiert, weil Vanille Lua 100% ANSI-C ist und in einem einzigen Thread läuft: es ist keine Notwendigkeit für die Sperrung Mechanismus implementiert werden. Die Entwickler haben jedoch entschieden, die Lock-Anweisungen für Leute, die Lua portieren und Threading im Interpreter implementieren, dorthin zu stellen.

Quellen:

+0

Wenn dies auf andere Archs Mutex-geschützt sein muss, warum ist es nicht notwendig, auf 64-Bit Ubuntu auf x86 ? [das System, auf dem ich arbeite] – anon

+0

Wenn Sie zulassen, dass die Lua-API für denselben 'lua_State' aus mehreren Threads aufgerufen wird, dann müssen Sie * einen geeigneten' lua_lock' und 'lua_unlock' definieren. Das Standard-Build führt dies nicht durch, da es die Leistung für den häufigsten Einzel-Thread-Fall beeinträchtigt, so dass Sie nicht einen einzelnen "Lua_State" aus mehreren Threads verwenden können. – RBerteig

+3

Sie müssen immer noch vorsichtig sein, wenn Sie mehrere eigene Threads implementieren. Wenn zwei Threads gleichzeitig versuchen, über eine Tabelle zu iterieren, sind lua_lock und lua_unlock nicht ausreichend. –