Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Are functions in the C standard library thread safe?

Where can I get a definitive answer, whether my memcpy (using the eglibc implementation that comes with Ubuntu) is thread safe? - Honestly, I really did not find a clear YES or NO in the docs.

By the way, with "thread safe" I mean it is safe to use memcpy concurrently whenever it would be safe to copy the date byte for byte concurrently. This should be possible at least if read-only data are copied to regions that do not overlap.

Ideally I would like to see something like the lists at the bottom of this page in the ARM compiler docs.

like image 780
not-a-user Avatar asked Nov 14 '13 09:11

not-a-user


People also ask

Are functions thread-safe?

Reentrance and thread safety are separate concepts: a function can be either reentrant, threadsafe, both, or neither.

Are function variables thread-safe?

On its stack(basically thread stack), local primitives and local reference variables are stored. Hence one thread does not share its local variables with any other thread as these local variables and references are inside the thread's private stack. Hence local variables are always thread-safe.

Is the standard library thread-safe?

Executive summary. Unless otherwise specified, standard library classes may safely be instantiated from multiple threads and standard library functions are reentrant, but non-const use of objects of standard library types is not safe if shared between threads.


2 Answers

You can find that list here, at chapter 2.9.1 Thread-Safety : http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_09_01

That is, this is a list over functions that posix does not require to be thread safe. All other functions are required to be thread safe. Posix includes the standard C library and the typical "unix" interfaces. (Full list here, http://pubs.opengroup.org/onlinepubs/9699919799/functions/contents.html)

memcpy() is specified by posix, but not part of the list in 2.9.1, and can therefore be considered thread safe.

The various environments on linux at least tries to implement posix to the best of its abilities - The functions on linux/glibc might be thread-safe even if posix doesn't require it to be - though this is rarely documented. For other functions/libraries than what posix covers, you are left with what their authors have documented...

From what I can tell, posix equates thread safety with reentrancy, and guarantees there is no internal data races. You, however, are responsible for the possible external data races - such as protecting yourself from calling e.g. memcpy() with memory that might be updated concurrently.

like image 190
nos Avatar answered Oct 09 '22 17:10

nos


It depends on the function, and how you use it.

Take for example memcpy, it is generally thread safe, if you copy data where both source and destination is private to a single thread. If you write to data that can be read from/written to by another thread, it's no longer thread safe and you have to protect the access.

like image 21
Some programmer dude Avatar answered Oct 09 '22 17:10

Some programmer dude