Skip to content

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

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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