c++ - OpenMP y STL vector
multithreading (2)
En este ejemplo particular, será seguro.
La razón es que no está utilizando operaciones que podrían causar una reasignación. (como push_back()
). Solo estás cambiando los contenidos de los elementos individuales.
Tenga en cuenta que puede legalmente hacer esto:
std::vector<int> v(1000);
int *ptr = &v[0];
# pragma omp parallel for
for (int i = 0; i < 1000; ++i) {
ptr[i] = i;
}
Se vuelve no seguro para subprocesos cuando comienza a llamar a métodos como push_back()
, pop_back()
, insert()
, etc ... desde varios subprocesos.
También agregaré que este ejemplo en particular no es adecuado para el paralelismo ya que casi no hay trabajo por hacer. Pero supongo que es solo un ejemplo estúpido con el propósito de hacer esta pregunta.
Tengo un código para el cual me gustaría usar OpenMP de la siguiente manera:
std::vector<int> v(1000);
# pragma omp parallel for
for (int i = 0; i < 1000; ++i) {
v[i] = i;
}
He leído que el contenedor de vectores STL no es seguro para subprocesos en la situación en la que varios subprocesos escriben en un solo contenedor, lo que implicaría que necesitaría bloquear el vector antes de realizar cualquier escritura; sin embargo, también me han dicho que la operación de escritura anterior es de alguna manera "atómica", por lo que no hay una condición de raza superior. ¿Podría alguien aclarar esto?
Las lecturas múltiples son seguras, pero recomendaría evitar escrituras múltiples en el mismo contenedor. Pero puedes escribir en la memoria que manejes por tu cuenta. La diferencia con un vector sería que puede estar seguro de que la memoria no se cambiará o reasignará al mismo tiempo. De lo contrario, también puede usar un semáforo, pero esto probablemente disminuiría la eficiencia y, si usa varios, puede incluso causar interbloqueos si no funciona correctamente.