Thread-safe simply means you can call the function from any number of threads without fear of corruption. Reentrant means a function can be safely called by the same thread recursively (directly or indirectly) without fear of corruption or deadlocking.