Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is ofstream thread safe?

I am working on a program, which uses multiple std::ifstreams for reading a binary file, one std::ifstream for each thread. Now I need to know, if std::ofstream is thread-safe on Windows and Linux for writing in a same file. I am using using only one std::ofstream and using for multiple threads.
I am reading different blocks using using each thread and writing those block in output file using seekp() and write(). Currently it is working for me but whether it is problematic for big files.

Is std::ofstream thread safe?

like image 692
Dipak Avatar asked Nov 26 '13 08:11

Dipak


People also ask

Is ifstream thread-safe?

All std libraries are thread safe but not "async" safe. So you can call the same functions from different threads but not on the same objects.

Is Stringstream thread-safe?

If your stringstream is created, used, and destroyed as an automatic variable by a single thread, it should be entirely threadsafe, unless your std::allocator is not threadsafe.

Is C++ set thread-safe?

It is safe to read and write to one instance of a type even if another thread is reading or writing to a different instance of the same type.

Is Fputs thread-safe?

Between a write and a subsequent read, there must be an intervening flush or reposition. Between a read and a subsequent write, there must also be an intervening flush or reposition unless an EOF has been reached. fputs_unlocked() is functionally equivalent to fputs() with the exception that it is not thread-safe.


3 Answers

If I haven't misunderstood you - no, nothing in the standard library is thread safe (except the std::thread specific things, of course (from C++11 and later)). You need additional synchronization.

Even more - if there are several processes, reading from/writing to these files, you need to lock the files, to sync the access.

like image 90
Kiril Kirov Avatar answered Oct 06 '22 17:10

Kiril Kirov


From C++ standards (Input/Output Library Thread Safety):

27.1.3 Thread safety [iostreams.thread-safety]

Concurrent access to a stream object [string.streams, file.streams], stream buffer object [stream.buffers], or C Library stream [c.files] by multiple threads may result in a data race [intro.multithread] unless otherwise specified [iostream.objects]. [Note: Data races result in undefined behavior [intro.multithread].

like image 28
Claudix Avatar answered Oct 06 '22 18:10

Claudix


I have written a little program to verify the thread-safety of std::ifstream and std::ofstream https://github.com/rmspacefish/rpi-file-concurrency . I have tested with on a Linux Desktop host and a Raspberry Pi. The program starts two threads, one writer thread and one reader thread and there is a textual mode and a binary mode.

In the textual mode, I am writing two lines in the writer thread, and the reader thread attempts to read two lines. For the textual mode, I get the following output:

Concurrent file access test
Write Open Fail Count: 0
Write Count: 191090
Write Fail Count: 0

Read Open Fail Count: 0
Read Count: 93253
Read One Line Count: 93253
Read Both Lines Count: 93253
Faulty Read Count: 0
EOF Count: 0
Fail Count: 0

Finished.

So this appears to be thread-safe for Linux. For the binary mode, I am writing a binary block in form of a struct consisting of multiple fields like char arrays, integers with various sizes etc. I have two states which are written in alternating cycles. In the reader thread, I check the consistency of the data (inconistent states or worse, wrong values). Here I get the following results

Concurrent file access test
Write Open Fail Count: 0
Write Count: 0
Write Fail Count: 0

Read Open Fail Count: 0
Read Count: 0
Blob in state one read: 25491
Blob in state two read: 24702
Blob in invalid state: 0
Faulty Read Count: 0
EOF Count: 91295
Fail Count: 91295

Finished.

I checked the error flags after calling read (and this is important). If there are no error flags, the state is read in a consistent manner. It looks thread-safe to me.

The thread-safety might still be implementation dependent, but at least for Linux/GCC, file access seems to be thread-safe. I will still test this with MSVC on Windows, but Microsoft specified this should be thread-safe as well.

like image 34
Spacefish Avatar answered Oct 06 '22 18:10

Spacefish