OpenMP and STL vector
In this particular example, it will be safe.
The reason is that you are not using operations that could cause a reallocation. (such as push_back()
). You are only changing the contents of the individual elements.
Note that you can just as legally do this:
std::vector<int> v(1000);int *ptr = &v[0];# pragma omp parallel forfor (int i = 0; i < 1000; ++i) { ptr[i] = i;}
It becomes not-thread-safe when you start calling methods like push_back()
, pop_back()
, insert()
, etc... from multiple threads.
I'll also add that this particular example isn't well-suited for parallelism since there's hardly any work to be done. But I suppose it's just a dumbed-down example for the purpose of asking this question.
Multiple reads are safe but I would recommend to avoid multiple writes to the same container. But you can write to memory you manage on your own. The difference to a vector would be that you can be sure that the memory would not be changed or reallocated at the same time. Otherwise you can also use a semaphore but this would probably decrease the efficiency and if you use several it can even cause deadlocks if you don't work properly.