Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Are std::map and std::vector thread safe?

I am developing a multi threaded application, each thread will read (there will be no modifying of structures) from a group of maps and vectors. Can anyone please advise, since the threads are only reading from these structures would it be necessary to implement a sharable mutex around the code blocks where these structures are being read?

like image 334
godzilla Avatar asked Apr 21 '13 11:04

godzilla


People also ask

Is std :: map thread-safe?

It isn't thread safe, insert from two threads and you can end up in an inconstant state.

Are std :: vectors thread-safe?

const and Thread Safety Therefore all classes available from the standard, e.g. std::vector<>, can safely be accessed from multiple threads in the same manner.

Is vector read thread-safe C++?

YES for the scenario you mention, it is perfectly Thread Safe.

Is reading from MAP thread-safe?

Yes it is. Show activity on this post.


1 Answers

In case of read only map/vector there is no need to use mutexes. This was already answered for both vector and map
While C++03 doesn't mention threads, C++11 has clause covering you question.

23.2.2 Container data races [container.requirements.dataraces]

1 For purposes of avoiding data races (17.6.5.9), implementations shall consider the following functions to be const: begin, end, rbegin, rend, front, back, data, find, lower_bound, upper_bound, equal_range, at and, except in associative or unordered associative containers, operator[].
2 Notwithstanding (17.6.5.9), implementations are required to avoid data races when the contents of the contained object in different elements in the same sequence, excepting vector<bool>, are modified concurrently.
3 [ Note: For a vector<int> x with a size greater than one, x[1] = 5 and *x.begin() = 10 can be executed concurrently without a data race, but x[0] = 5 and *x.begin() = 10 executed concurrently may result in a data race. As an exception to the general rule, for a vector < bool > y, y[0] = true may race with y[1] = true. —end note ]

Thus in C++11 it is allowed not only to read objects , but also allow concurrent modification of its different objects(but not container!), with exception for vector < bool >

like image 185
alexrider Avatar answered Sep 28 '22 09:09

alexrider