Yes. The problem is that global state like the rounding mode, or default precision, can be set by any thread.
That means that each thread needs it's own copy of those value.
Currently, any use of the rounding mode or default precision is not safe if you have multiple threads, because you can never be sure another thread doesn't modify it.
Julia currently has no easy way of saying that particular values in global scope need to be thread local (i.e. have the variable in thread-local-storage, and when it is set or fetched, have it gotten from there).
There would also need to be a way of initializing those values for every thread.
The workaround that Yichao Yu proposed means 1) making a Julia vector for each value that needs to be thread safe, resizing it based on the max # of threads in __init__, and then initializing all of them, 2) changing all gets and sets to index by the thread id.
Having to call a C function to get the thread id and then use it to index the vectors every time you do an operation on a BigFloat incurs a pretty big performance penalty.
The problem has nothing to do with that, it has to do with each thread needs its own state, and there is no mechanism to handle that AFAIK in Julia (and I think Yichao Yu would have proposed a different scheme if there were).
Scott