多线程出现奇怪错误

使用多线程时,每次运行出现不同错误。代码如下:

using LinearAlgebra
using DelimitedFiles
using Roots
const r = 1.
const R = 10.
const δ = 0.05

function get_nh(z::Float64, θ::Float64)
    2R/3.0/sind(θ)*(1.0-(1.0+z/R)^(-1.5))
end

function line(z::Float64, x::Float64, y::Float64, θ::Float64)
    (z/tand(θ)+x)^2+y^2-r^2*(1+z/R)^3
end

function agl(θ::Float64, ϕ::Float64, t::Float64)
    s = [sind(θ), 0., cosd(θ)]
    c = [sind(ϕ)*cosd(t), sind(ϕ)*sind(t), cosd(ϕ)]
    r::Float64 = s⋅c
    if r < 0.
        r = -1.0
    elseif r > 1.
        r = 0.
    else
        r = acosd(r)
    end
    r
end

function simulate(θ::Float64, ϕ::Float64)
    nH = Float64[]
    Threads.@threads for t in 0.:1.:359.
        tang::Float64 = 90.0-agl(θ, ϕ, t)
        if tang ≥ 90.
            continue
        end
        for y in δ/2:δ:r, x in -r+δ/2:δ:r
            if x^2+y^2 > r^2
                continue
            end
            height = (√(r^2-y^2)-x)*tand(tang)
            f(z) = line(z, x, y, tang)
            rts = find_zeros(f, 0, 10height+1, no_pts=100, k=20)
            sort!(rts)
            if sizeof(rts) == 0
                push!(nH, 2R/3.0/sind(θ))
            end
            nh = get_nh(rts[1], θ)
            push!(nH, nh)
        end
    end
    writedlm("nh_$(θ)_$(ϕ)", nH)
end

simulate(10., 30.)

代码有时能够正确运行,有时出现错误,错误现在发现有3种,每次都不同。
1.

ERROR: LoadError: TaskFailedException:
BoundsError: attempt to access 0-element Array{Float64,1} at index [1]
Stacktrace:
 [1] getindex at ./array.jl:809 [inlined]
 [2] macro expansion at simulate.jl:48 [inlined]
 [3] (::var"#2#threadsfor_fun#1"{Float64,Float64,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}})(::Bool) at ./threadingconstructs.jl:81
 [4] (::var"#2#threadsfor_fun#1"{Float64,Float64,StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}})() at ./threadingconstructs.jl:48
Stacktrace:
 [1] wait at ./task.jl:267 [inlined]
 [2] threading_run(::Function) at ./threadingconstructs.jl:34
 [3] macro expansion at ./threadingconstructs.jl:93 [inlined]
 [4] simulate(::Float64, ::Float64) at simulate.jl:32
 [5] top-level scope at simulate.jl:56
 [6] include(::Function, ::Module, ::String) at ./Base.jl:380
 [7] include(::Module, ::String) at ./Base.jl:368
 [8] exec_options(::Base.JLOptions) at ./client.jl:296
 [9] _start() at ./client.jl:506
signal (11): Segmentation fault
in expression starting at simulate.jl:56
unknown function (ip: 0x7f81bd7a663e)
jl_realloc_aligned at /buildworker/worker/package_linux64/build/src/gc.c:248 [inlined]
gc_managed_realloc_ at /buildworker/worker/package_linux64/build/src/gc.c:3376 [inlined]
jl_gc_managed_realloc at /buildworker/worker/package_linux64/build/src/gc.c:3393
array_resize_buffer at /buildworker/worker/package_linux64/build/src/array.c:660
jl_array_grow_at_end at /buildworker/worker/package_linux64/build/src/array.c:875 [inlined]
jl_array_grow_end at /buildworker/worker/package_linux64/build/src/array.c:939
_growend! at ./array.jl:892 [inlined]
push! at ./array.jl:935
unknown function (ip: 0x7f8190487eca)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2214 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2398
macro expansion at simulate.jl:49 [inlined]
#2#threadsfor_fun at ./threadingconstructs.jl:81
#2#threadsfor_fun at ./threadingconstructs.jl:48
unknown function (ip: 0x7f819047c2ac)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2231 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2398
jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1690 [inlined]
start_task at /buildworker/worker/package_linux64/build/src/task.c:707
unknown function (ip: (nil))
Allocations: 3209554418 (Pool: 3208767322; Big: 787096); GC: 205
Segmentation fault (core dumped)
signal (6): Aborted
in expression starting at simulate.jl:56
gsignal at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
abort at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x7fea6324b896)
unknown function (ip: 0x7fea63252909)
cfree at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
jl_realloc_aligned at /buildworker/worker/package_linux64/build/src/gc.c:249 [inlined]
gc_managed_realloc_ at /buildworker/worker/package_linux64/build/src/gc.c:3376 [inlined]
jl_gc_managed_realloc at /buildworker/worker/package_linux64/build/src/gc.c:3393
array_resize_buffer at /buildworker/worker/package_linux64/build/src/array.c:660
jl_array_grow_at_end at /buildworker/worker/package_linux64/build/src/array.c:875 [inlined]
jl_array_grow_end at /buildworker/worker/package_linux64/build/src/array.c:939
_growend! at ./array.jl:892 [inlined]
push! at ./array.jl:935
unknown function (ip: 0x7fea3c086eca)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2214 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2398
macro expansion at simulate.jl:49 [inlined]
#2#threadsfor_fun at ./threadingconstructs.jl:81
#2#threadsfor_fun at ./threadingconstructs.jl:48
unknown function (ip: 0x7fea3c07b2ac)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2231 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2398
jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1690 [inlined]
start_task at /buildworker/worker/package_linux64/build/src/task.c:707
unknown function (ip: (nil))
Allocations: 3203627260 (Pool: 3202841586; Big: 785674); GC: 204
Aborted (core dumped)

单线程下应该没有问题,但是测试次数不多。使用的Julia版本1.5。
写多线程需要注意什么吗,还是有bug?
我在https://discourse.julialang.org/t/segfault-while-using-threads/26705看到了相似的错误,这个问题还没有解决吗?

如果找不到错误的话,试试这个包

@enter code
1|>(debug) 按n表示下一步
2|>(debug) w add expr 比如 w add print(1), 会执行代码

多线程内部加断点不会停,仍然会出现signal(6)或者signal(11)的错误,之后REPL就崩溃了。

跟这个应该没关系

我看你有时候往 nH里在push!,这样感觉会有问题的,你换成channel试试

你这个例子里,无关的信息还是太多了,可以试着简化下方便debug

多谢,加了锁以后没有问题了,之前想当然的以为push!会自动加锁。