1.
#include <string.h>
char * strerror(int errnum);
AND
#include <string.h>
int strerror_r(int errnum, char *buf, size_t len);
former:not thread-safe
latter:thread-safe
2.
In single-threaded programs, errno is a global variable.
In multithreaded programs, however, errno is stored per-thread, and is thus thread-safe.