Pregunta ¿Propósito de lua_lock y lua_unlock?


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

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

Lo siguiente implica que no hace nada:

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

Por favor ilumina.


12
2018-06-10 00:49


origen


Respuestas:


Si transfiere Lua a otra plataforma, se le "permite" sobrescribir lua_lock con tu 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:


20
2018-06-10 00:59