这是我用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 是开启一个用户级的轻量线程—协程,而相比线程它的切换速度,资源占用等都有了很多优势
上 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
函数点改冒号。