You can think of three levels of thread safety, which I'll number here for ease of reference.
1) Not thread safe at all. It is unsafe to call the function concurrently from multiple threads. For example, strtok
.
2) Thread safe with respect to the system. It is safe to call the function concurrently from multiple threads, provided that the different calls operate on different data. For example, rand_r
, memcpy
.
3) Thread safe with respect to data. It is safe to call the function concurrently from multiple threads, even acting on the same data. For example pthread_mutex_lock
.
rand_r
is at level 2, and the convention in the context of C (in particular in the POSIX specification) is to call this "thread safe".
In some other languages, such as Java, the convention is to refer to level 3 as "thread safe" and everything else as "not thread safe". So for example java.util.Vector
is "thread safe" and java.util.ArrayList
is "not thread safe". Of course all the methods of java.util.ArrayList
are at level 2. So a programmer coming from Java might naturally call rand_r
and memcpy
"not thread safe".
In C the convention is different, perhaps because internally synchronised data structures are fairly rare to begin with. In the context of C you might ask "are file handles thread-safe?", and be talking about level 3, but when asking "is this function thread-safe?" that generally means level 2.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…