2010-06-10 8 views
12

¿Cuál es el punto de lua_lock y lua_unlock?¿Propósito de lua_lock y lua_unlock?

El siguiente implica que es importante:

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

El siguiente implica que no hace nada:

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

favor ilumine.

Respuesta

19

Si transfiere Lua a otra plataforma, se le "permite" sobrescribir lua_lock con su propia definición; y esta definición debería ser esencialmente un mutex, para no permitir operaciones de cruce entre los mismos objetos Lua. Esencialmente, cuando se implementa, debe actuar de forma similar al bloqueo de intérprete global de Python (GIL).

Se define como no operativa en Lua vainilla, porque la vainilla Lua es 100% ANSI-C y se ejecuta en un solo hilo: no es necesario implementar ningún mecanismo de bloqueo. Sin embargo, los desarrolladores decidieron poner las declaraciones de bloqueo allí para las personas que portan Lua e implementan el enhebrado en el intérprete.

Fuentes:

+0

Si esto tiene que ser mutex-protegido en el resto de arquitecturas, por qué no es necesario en Ubuntu de 64 bits en x86 ? [el sistema en el que me estoy ejecutando] – anon

+0

Si permite que la API Lua sea llamada para el mismo 'lua_State' de múltiples hilos, entonces * debe * definir un' lua_lock' y 'lua_unlock' apropiados. La compilación predeterminada no hace esto porque daña el rendimiento para el caso de subproceso más común, por lo que no puede usar un solo 'lua_State' de varios subprocesos. – RBerteig

+3

Aún debe tener cuidado si implementa varios hilos propios. Si dos hilos intentan iterar sobre una tabla al mismo tiempo, lua_lock y lua_unlock no serán suficientes. –

Cuestiones relacionadas