以下是我修改你的test.lua代码:
local xxx=0
local start = os.time()
local function ff(n)
for i=1,100000000,1 do
xxx=xxx+1
end
end
local st1 = systhread.create(ff, 10)
local st2 = systhread.create(ff, 10)
local st3 = systhread.create(ff, 10)
local st4 = systhread.create(ff, 10)
st1:resume()
st2:resume()
st3:resume()
st4:resume()
st1:wait() print('Thread 1 exitcode : '..st1:exitcode())
st2:wait() print('Thread 2 exitcode : '..st2:exitcode())
st3:wait() print('Thread 3 exitcode : '..st3:exitcode())
st4:wait() print('Thread 4 exitcode : '..st4:exitcode())
local finish = os.time()
print('start is --> \t'..start.."\n")
print('finish is --> \t'..finish.."\n")
print('finish-start --> \t'..(finish-start).."\n")
print('xxx is --> \t'..xxx.."\n")
systhread.sleep(10000)
测试结果:
$ ./lua.exe test.lua
Thread 1 exitcode : 0
Thread 2 exitcode : 0
Thread 3 exitcode : 0
Thread 4 exitcode : 0
start is --> 1514133425
finish is --> 1514133434
finish-start --> 9
xxx is --> 400000000
问题所在:
如果使用了多核特性,那么 xxx必然不可能是 400000000,因为xxx并没有加锁,多线程若同时运行,+1操作必然重复,xxx必然小于 400000000,然而现在等于 400000000,仿佛加了锁一般,证明lua虚拟机中全局锁在起作用,一个时刻,虚拟机只执行一个线程的字节码。
以下是我修改你的test.lua代码:
测试结果:
$ ./lua.exe test.lua
Thread 1 exitcode : 0
Thread 2 exitcode : 0
Thread 3 exitcode : 0
Thread 4 exitcode : 0
start is --> 1514133425
finish is --> 1514133434
finish-start --> 9
xxx is --> 400000000
问题所在:
如果使用了多核特性,那么 xxx必然不可能是 400000000,因为xxx并没有加锁,多线程若同时运行,+1操作必然重复,xxx必然小于 400000000,然而现在等于 400000000,仿佛加了锁一般,证明lua虚拟机中全局锁在起作用,一个时刻,虚拟机只执行一个线程的字节码。