Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is assignment to a std::vector element thread-safe?

I have made a thread pool which writes to the same vector at the same time.

Is this implementation thread safe?

If it is not, how should I fix it?

std::vector<double> global_var;

void func1(int i)
{
    global_var[i]=some_computation(i /* only depends on i */);
}

void load_distribution()
{
    const int N_max=100;
    global_var.assign(N_max,0.0);
    std::vector<std::thread> th_pool;
    for(long i=0;i<N_max;i++)
        th_pool.push_back(std::thread(func1,i));

    for(std::thread& tp : th_pool)
        tp.join();
}

Update

global_var will not be touched by any other part of the program before all threads terminated.

like image 701
ar2015 Avatar asked Dec 18 '25 13:12

ar2015


2 Answers

Assuming your global vector is not modified by any other part of code, then your code is thread safe.

Each thread is going to write (access) into a different cell of the vector, so there is no "dirty update" problem.

Moreover the vector's type is a double, in a modern architecture is bigger than a WORD-size. So each array cell is not overlapped among others.

like image 84
BiagioF Avatar answered Dec 21 '25 03:12

BiagioF


[container.requirements.dataraces]/1-2:

1 For purposes of avoiding data races ([res.on.data.races]), implementations shall consider the following functions to be const: begin, end, rbegin, rend, front, back, data, [...], at and, except in associative or unordered associative containers, operator[].

2 Notwithstanding ([res.on.data.races]), implementations are required to avoid data races when the contents of the contained object in different elements in the same container, excepting vector<bool>, are modified concurrently.

like image 25
T.C. Avatar answered Dec 21 '25 03:12

T.C.



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!