Lua没有内置的线程局部变量,但你可以为每个Lua线程使用一个单独的表来存储线程局部变量,并找出正在运行的线程coroutine.running(或lua_pushthread在C中).然后用metatables使它更方便.就像是:
local _G, coroutine = _G, coroutine
local main_thread = coroutine.running() or {} -- returns nil in Lua 5.1
local thread_locals = setmetatable( { [main_thread]=_G }, { __mode="k" } )
local TL_meta = {}
function TL_meta:__index( k )
local th = coroutine.running() or main_thread
local t = thread_locals[ th ]
if t then
return t[ k ]
else
return _G[ k ]
end
end
function TL_meta:__newindex( k, v )
local th = coroutine.running() or main_thread
local t = thread_locals[ th ]
if not t then
t = setmetatable( { _G = _G }, { __index = _G } )
thread_locals[ th ] = t
end
t[ k ] = v
end
-- convenient access to thread local variables via the `TL` table:
TL = setmetatable( {}, TL_meta )
-- or make `TL` the default for globals lookup ...
if setfenv then
setfenv( 1, TL ) -- Lua 5.1
else
_ENV = TL -- Lua 5.2+
end
Run Code Online (Sandbox Code Playgroud)