对于Channel没有满时,lock起作用,而当Channel满时,lock不起作用!! 很意外!!
function showme(n)
c = Channel(0)
t1 = @async begin
sleep(3)
for _ in 1:n
put!(c, 0)
sleep(0.1)
end
end
t2 = @async begin
# sleep(rand())
lock(c)
for _ in 1:n
put!(c, 1)
sleep(0.1)
end
unlock(c)
end
d= []
sleep(3)
for _ in 1:2n
push!(d, take!(c))
end
show(d)
end
julia> showme(5)
Any[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
# 本以为应该是下面这个:
#Any[ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
很明显,没有锁住channel !!!
接下来,把上面函数里第二行的channel size变一下:
c = Channel(2n)
再运行
julia> showme(5)
Any[1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
julia> showme(5)
Any[1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
julia> showme(5)
Any[1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
很明显,可以锁住channel !!!
接下来,把上面函数里第二行的channel size变一下, 可以是任意一个<n的数, 例如n-1
:
c = Channel(n>=1 ? n-1 : 0)
运行
julia> showme(5)
Any[1, 1, 1, 1, 1, 0, 0, 0, 0, 0] (第一次运行)
julia> showme(5)
Any[1, 1, 1, 1, 0, 1, 0, 0, 0, 0]
julia> showme(5)
Any[1, 1, 1, 1, 0, 1, 0, 0, 0, 0]
很明显,没有锁住channel !!!
当把channel size 调整到n时,即:
c = Channel(n)
运行
julia> showme(5)
Any[1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
julia> showme(5)
Any[1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
julia> showme(5)
Any[1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
终于锁住channel 了 !!!