今天我用到信号量时发现一个问题


这是我用c语言和julia做的两个相同版本
功能:主线程中从控制台输入一个字符串,另一个线程统计这个字符串长度
c语言运行结果:
hello
you entered 6 words
w
you entered 2 words
end

程序还有一点点要修正,不过问题不大
julia运行结果:
hello
you entered 5 words
ww
you entered 5 words
(不管输入什么,都显示you entered 5 words,包括end)

因为我只能发一张图,就只好用文字代替一下

另外我不知道为什么不能用 using Base.Semaphore却可以用using Base.Threads
这很奇怪,我只好用Semaphore=Base.Semaphore
顺便说一下我不知道Semaphore(1)创建时的值是1还是0,用户不能自定义初始化有点难用啊

刚才修复好了,julia主线程中while语句内应该用global str代替str
其他问题还没解决

@async并不是开启新线程,你可能有什么误会

@async 是开启一个用户级的轻量线程—协程,而相比线程它的切换速度,资源占用等都有了很多优势

Channel 可以。都 @async 用上协程了,就直接用 Julia 提供的函数嘛。

文档:

https://docs.juliacn.com/latest/manual/parallel-computing/#协程-1

c1 = Channel(32)
c2 = Channel(32)

function fn()
    while (data = take!(c1)) != "end" # 这里的判断是多余的
        put!(c2, length(data))
    end
end


@async fn()
while (s = readline(stdin)) != "end"
    put!(c1, s)
    len = take!(c2)
    println("You entered $(len) word" * (len==1 ? "" : "s"))
end

测试

> julia 2206-async.jl
hello
You entered 5 words
w
You entered 1 word

You entered 0 words
asdf
You entered 4 words
0
You entered 1 word
1+1
You entered 3 words


help 一下就知道了

help?> Base.Threads
  Experimental multithreading support.

help?> Base.Semaphore
  Semaphore(sem_size)

  Create a counting semaphore that allows at most sem_size acquires to be in use at any time. Each acquire must be
  matched with a release.

  This construct is NOT threadsafe.

julia> using Base.Threads

julia> using Base: Semaphore

一个是模块,一个是函数,using 函数点改冒号。

thank you:hushed:

确实误会了,多谢提醒