使用多线程时,每次运行出现不同错误。代码如下:
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看到了相似的错误,这个问题还没有解决吗?