Назначение lua_lock и lua_unlock? - PullRequest
12 голосов
/ 10 июня 2010

Какой смысл 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)

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

1 Ответ

20 голосов
/ 10 июня 2010

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

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

Источники:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...