lua_lock和lua_unlock的目的?

ano*_*non 12 lua

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);
}
Run Code Online (Sandbox Code Playgroud)

以下暗示它什么都不做:

#define lua_lock(L)     ((void) 0) 
#define lua_unlock(L)   ((void) 0)
Run Code Online (Sandbox Code Playgroud)

请指教.

Mar*_*off 20

如果您将Lua移植到另一个平台,则"允许" lua_lock使用您自己的定义覆盖; 并且这个定义本质上应该是一个互斥体,以禁止在相同的Lua对象上进行跨线程操作.基本上,在实现时,它应该与Python的全局解释器锁(GIL)类似.

它被定义为香草Lua中的无操作,因为vanilla Lua是100%ANSI-C并且在单个线程中运行:不需要实现任何锁定机制.但是,开发人员选择将锁定语句放在那里,用于移植Lua并在解释器中实现线程的人.

资料来源:

  • 如果你实现多个线程拥有自己的线程,你仍然需要小心.如果两个线程同时尝试迭代一个表,则lua_lock和lua_unlock将不够. (3认同)
  • 在Lua中进行多线程的理智方法是每个线程有一个Lua状态,并在它们之间显式或使用共享C数据结构进行通信.例如,随意使用C++ 11或Facebook的愚蠢或英特尔TBB的任何现有并发数据结构并将它们绑定到Lua(使用LuaJIT很容易),或者使用任何其他C数据结构并围绕它实现自己的锁定.您甚至可以使用通道并在状态之间来回传递实际的Lua结构.说说灵活! (2认同)