Is writing to stdout using printf thread-safe on Linux? What about using the lower-level write command?
Is writing to stdout using printf thread-safe on Linux? What about using the lower-level
Share
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
It’s not specified by the C standard — it depends on your implementation of the C standard library. In fact, the C standard doesn’t even mention threads at all, since certain systems (e.g. embedded systems) don’t have multithreading.
In the GNU implementation (
glibc), most of the higher-level functions in stdio that deal withFILE*objects are thread-safe. The ones that aren’t usually haveunlockedin their names (e.g.getc_unlocked(3)). However, the thread safety is at a per-function call level: if you make multiple calls toprintf(3), for example, each of those calls is guaranteed to output atomically, but other threads might print things out between your calls toprintf(). If you want to ensure that a sequence of I/O calls gets output atomically, you can surround them with a pair offlockfile(3)/funlockfile(3)calls to lock theFILEhandle. Note that these functions are reentrant, so you can safely callprintf()in between them, and that won’t result in deadlock even thoughtprintf()itself makes a call toflockfile().The low-level I/O calls such as
write(2)should be thread-safe, but I’m not 100% sure of that –write()makes a system call into the kernel to perform I/O. How exactly this happens depends on what kernel you’re using. It might be thesysenterinstruction, or theint(interrupt) instruction on older systems. Once inside the kernel, it’s up to the kernel to make sure that the I/O is thread-safe. In a test I just did with the Darwin Kernel Version 8.11.1,write(2)appears to be thread-safe.