He creado un grupo de subprocesos que escribe en el mismo vector al mismo tiempo.

¿Es seguro este hilo de implementación?

Si no es así, ¿cómo debo solucionarlo?

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();
}

Actualizar

global_var no será tocado por ninguna otra parte del programa antes de que todos los hilos terminen.

2
ar2015 30 dic. 2016 a las 00:57

3 respuestas

La mejor respuesta

Suponiendo que su vector global no esté modificado por ninguna otra parte del código, entonces su código es seguro para subprocesos.

Cada hilo va a escribir (acceder) en una celda diferente del vector, por lo que no hay ningún problema de "actualización sucia" .

Además, el tipo de vector es doble, en una arquitectura moderna es más grande que un tamaño WORD. Por lo tanto, cada celda de la matriz no se superpone entre otras.

2
Biagio Festa 29 dic. 2016 a las 22:15

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

1 Para evitar carreras de datos ([res.on.data.races]), las implementaciones considerarán las siguientes funciones como const: begin, end, rbegin, rend, front, back, data, [...], {{ X8}} y, excepto en asociativo o desordenado contenedores asociativos, operator[].

2 No obstante ([res.on.data.races]), se requieren implementaciones para evitar carreras de datos cuando el contenido del objeto contenido en diferentes elementos en el mismo contenedor, excepto vector<bool>, son modificado al mismo tiempo.

3
T.C. 29 dic. 2016 a las 22:35

En general, std::vector no es seguro para subprocesos, pero el código anterior funcionará porque la matriz de respaldo se asigna previamente con el método assign().

Mientras los escritores no causen la reasignación de la matriz de respaldo, el código funcionará. El método assign() preasignará suficiente espacio para que no suceda cuando el hilo lo escriba.

-1
Zbynek Vyskovsky - kvr000 29 dic. 2016 a las 22:07