The _r
versions of functions are reentrant: you can call them from multiple threads simultaneously, or in nested loops, et cetera. Reentrant versions usually take an extra argument, this argument is used to store state between calls instead of using a global variable.
The non-reentrant versions often use global state, so if you call them from multiple threads, you are probably invoking undefined behavior. Your program could crash, or worse.
From the man pages (man 3 strtok
):
The strtok_r()
function is a reentrant version of strtok()
. The context
pointer last must be provided on each call. The strtok_r()
function may
also be used to nest two parsing loops within one another, as long as
separate context pointers are used.