Skip to content

测试发现多线程并没有发挥多核特性(并没有加速作用),仅仅起到了多线程可重入不出错的作用(相当于加了全局锁)。 #1

@fengyikil

Description

@fengyikil

以下是我修改你的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虚拟机中全局锁在起作用,一个时刻,虚拟机只执行一个线程的字节码。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions