Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ Access to vector from multiple threads

In my program I've some threads running. Each thread gets a pointer to some object (in my program - vector). And each thread modifies the vector.

And sometimes my program fails with a segm-fault. I thought it occurred because thread A begins doing something with the vector while thread B hasn't finished operating with it? Can it bee true?

How am I supposed to fix it? Thread synchronization? Or maybe make a flag VectorIsInUse and set this flag to true while operating with it?

like image 436
Kolyunya Avatar asked Sep 04 '12 09:09

Kolyunya


People also ask

Is Vector synchronized in C++?

Below given are the key differences between the C++ Vector and List: As the elements in the Vector are stored in the contiguous memory locations so they are synchronized whereas the elements in the List are stored randomly and connected with each other through the links (pointers) so they are non- synchronized.

Can multiple threads access the same array?

The answer is no. Each array element has a region of memory reserved for it alone within the region attributed the overall array. Modifications of different elements therefore do not write to any of the same memory locations.

Are STD Vector thread safe?

This has to be a dup. But, no, none of the standard containers are thread-safe.

Does C allow multi threading?

C does not contain any built-in support for multithreaded applications. Instead, it relies entirely upon the operating system to provide this feature. This tutorial assumes that you are working on Linux OS and we are going to write multi-threaded C program using POSIX.


1 Answers

vector, like all STL containers, is not thread-safe. You have to explicitly manage the synchronization yourself. A std::mutex or boost::mutex could be use to synchronize access to the vector.

Do not use a flag as this is not thread-safe:

  • Thread A checks value of isInUse flag and it is false
  • Thread A is suspended
  • Thread B checks value of isInUse flag and it is false
  • Thread B sets isInUse to true
  • Thread B is suspended
  • Thread A is resumed
  • Thread A still thinks isInUse is false and sets it true
  • Thread A and Thread B now both have access to the vector

Note that each thread will have to lock the vector for the entire time it needs to use it. This includes modifying the vector and using the vector's iterators as iterators can become invalidated if the element they refer to is erase() or the vector undergoes an internal reallocation. For example do not:

mtx.lock();
std::vector<std::string>::iterator i = the_vector.begin();
mtx.unlock();

// 'i' can become invalid if the `vector` is modified.
like image 172
hmjd Avatar answered Sep 24 '22 10:09

hmjd