【lock】满了的Channel锁不住 !!!

对于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 了 !!!

上面对lock channel的理解是不正确的, Julia的文档还需要多努力详细一点。

https://discourse.julialang.org/t/why-lock-does-not-work-for-full-channel/65710/5

1 个赞