The presence of interrupts is basically equivalent to not being single threaded, though. There are true single-threaded environments, it's just limited to userspace processes that don't handle signals.
It is even worse: re-entrancy safe is a different property than thread-safe. For example you can't use mutexes to guarantee mutual exclusions with interrupts.
Some algorithms are both thread safe and reentrancy safe, but generally this is not the case.
Some algorithms are both thread safe and reentrancy safe, but generally this is not the case.