White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

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なら中断。