- 
                Notifications
    You must be signed in to change notification settings 
- Fork 71
Description
The slow versions of the _round methods in src/interval/rounding.jl use BigFloat together with setrounding in a way that is not thread-safe. For setprecision there is a precision_lock defined at the top of the file that is used to make it thread-safe, but not such look is used for the setrounding. Starting Julia with two threads I could reliably produce errors with the following code
x = interval(BigFloat, 1)
y = sin(x)
Threads.@threads for _ in 1:1000
    z = sin(x)
    @assert isequal_interval(y, z)
endIn many cases (though not all) I also found that after running this loop even the non-threaded behavior is wrong. Most of the time this fails:
setrounding(BigFloat, RoundNearest) # Reset rounding in case this would be an issue
z = sin(x)
@assert isequal_interval(y, z)So there is some global state that gets messed up.
I made a quick attempt at fixing this by adding locks around setround, but I could still not get it to work properly. So there might be something else that I'm missing as well.