Подтвердить что ты не робот

Назначение 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)

Пожалуйста, просветите.

4b9b3361

Ответ 1

Если вы переносите Lua на другую платформу, вы можете "перезаписать" lua_lock своим собственным определением; и это определение должно по существу быть мьютексом, чтобы запретить операции поперечного потока на тех же объектах Lua. По существу, когда он реализован, он должен действовать аналогично Python Global Interpreter Lock (GIL).

Он определен как no-op в vanilla Lua, потому что vanilla Lua - это 100% ANSI-C и работает в одном потоке: нет необходимости в каком-либо механизме блокировки. Тем не менее, разработчики решили разместить там инструкции блокировки для людей, которые порт Lua и реализовать потоки в интерпретаторе.

Источники: