Such a function is non-reentrant, because its result can be overwritten by successive invocations. The implementation of such a function is non-reentrant if the implementation fails to synchronize invocations of the function and thus fails to protect the state information. Functions must be reentrant in an environment of multithreaded processes, in order to ensure that they can be safely invoked by concurrently executing threads.
Some functions can be reentrant or non-reentrant, depending on their arguments.
These functions have pointers to character strings as arguments. The seed value is held in a library-allocated static memory location. Note that this function also suffers from the problem of returning its result in a library-allocated structure. They are optional for implementations that do not support threads. But this definition is unacceptable in a multithreaded environment, because its use can result in nondeterministic results.