Какой смысл 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)
Просветите.
Если вы переносите Lua на другую платформу, вам "разрешено" перезаписать lua_lock
своим собственным определением; и это определение должно быть по сути мьютексом, чтобы запретить межпотоковые операции над одними и теми же объектами Lua. По сути, при реализации это должно действовать аналогично глобальной блокировке интерпретатора Python (GIL).
В ванильном Lua она определена как no-op, потому что ванильный Lua на 100% состоит из ANSI-C и работает в один поток: нет необходимости в реализации какого-либо механизма блокировки. Тем не менее, разработчики решили поместить туда утверждения блокировки для тех, кто портирует Lua и реализует потоки в интерпретаторе.
Источники: