请问Julia怎么开启一个线程

最近看Julia的dev文档,Base那块 多线程那块只是提了@threads这个宏是用来优化for循环的,另外还给了互斥锁,信号量,原子的文档,就是没提到像其他语言那样开启一个线程,请问Julia多线程应该怎么用啊

※ 警告:好孩子不要模仿

# Micro$oft Windows only
julia> function threadproc(lpparams)
           for i=1:5
               ccall(:Sleep,Nothing,(UInt32,),1000)
               ccall(:printf,Int32,(Cstring,),"Hello\n")
           end
           return UInt32(0x2a)
       end
threadproc (generic function with 1 method)

julia> pfn=@cfunction(threadproc,UInt32,(Ptr{Cvoid},))
Ptr{Nothing} @0x000000001828f460

julia> ret=Ref(UInt32(0))
Base.RefValue{UInt32}(0x00000000)

julia> h=ccall(:CreateThread,stdcall,Ptr{Cvoid},(Ptr{Cvoid},UInt,Ptr{Cvoid},Ptr{Cvoid},Int32,Ptr{Int32}),C_NULL,0,pfn,C_NULL,0,C_NULL)
Ptr{Nothing} @0x00000000000003f4

julia> Hello
Hello
Hello
Hello
Hello
julia> ccall(:GetExitCodeThread,stdcall,Int32,(Ptr{Cvoid},Ptr{UInt32}),ans,ret)
1

julia> ret
Base.RefValue{UInt32}(0x0000002a)

julia> ccall(:CloseHandle,stdcall,Int32,(Ptr{Cvoid},),h)
1
1 个赞

Julia没有内置的多线程接口,线程的API和系统相关。实际使用的时候如果不用ccall应当使用 Threads.@spawn 在spawn的数量和当前 JULIA_NUM_THREADS 一致的时候你可以认为每个task是一个线程。