Luaで擬似マルチスレッドテスト
ちょっと書いてみた。
たいしたもんじゃない&適した書き方かどうか知らないけど、こんなのもできるよってことで。
function bar() j =1 while j<1024 do j=j*2 print("j",j) coroutine.yield() end end function foo() i =0 while i<10 do i=i+1 print("i",i) coroutine.yield() end end co1 = coroutine.create(foo) co2 = coroutine.create(bar) b = true; c = true; repeat if b == true then b = coroutine.resume(co1,b) end if c == true then c = coroutine.resume(co2,c) end until (b ~= true and c ~= true)
coroutine_samp.luaで保存。
実行結果
>luac coroutine_samp.lua >lua luac.out i 1 j 2 i 2 j 4 i 3 j 8 i 4 j 16 i 5 j 32 i 6 j 64 i 7 j 128 i 8 j 256 i 9 j 512 i 10 j 1024 >
何をやっているかというと、まず二つの関数(片方はカウンタを1ずつ増やして、もう片方は2倍にしていく)を作って、それをコルーチンとして登録。あとは両方のコルーチンが終わるまで実行。関数foo,barは中でcoroutine.yieldを呼んでるけど、これによってコルーチンの動作が一時的に中断される。b = coroutine.resume(co1,b)ってなってるけど、このときのbには、中断なのか、それとも終了なのかの判定が入る。trueなら中断。