2012-02-13 21 views
16

Tengo un poco de código para las cuales me gustaría utilizar OpenMP de la siguiente manera:OpenMP y STL vector

std::vector<int> v(1000); 
# pragma omp parallel for 
for (int i = 0; i < 1000; ++i) { 
    v[i] = i; 
} 

He leído ese contenedor STL vector es no apta para subprocesos en la situación en varios hilos escriben en un solo contenedor, lo que implicaría que necesitaría bloquear el vector antes de hacer 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 carrera anterior. ¿Alguien podría aclarar esto?

+0

Comprobar si concurrent_vector permite múltiples lecturas, escribe – user

Respuesta

26

En este ejemplo en particular, será seguro.

La razón es que no está utilizando operaciones que podrían causar una reasignación. (como push_back()). Solo está cambiando el contenido de los elementos individuales.

Tenga en cuenta que sólo 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 convierte en no-thread-safe cuando se inicia métodos de llamada como push_back(), pop_back(), insert(), etc ... desde varios subprocesos .

También agregaré que este ejemplo particular no es muy adecuado para el paralelismo ya que apenas hay trabajo por hacer. Pero supongo que es solo un ejemplo tonto para el propósito de hacer esta pregunta.

+0

¡Gracias por la respuesta rápida! – cbd

+4

"no se modifica el vector en sí" -> "no se utilizan operaciones que podrían causar una reasignación". Pero +1 de todos modos. –

+0

@larsmans Sí, esa es una mejor redacción que la que usé. :) Voy a cambiar eso. Gracias. – Mysticial

0

Múltiples lecturas son seguras, pero recomendaría evitar varias escrituras en el mismo contenedor. Pero puede escribir en la memoria que administra por su cuenta. La diferencia con un vector sería que puede estar seguro de que la memoria no se cambiará ni reasignará al mismo tiempo. De lo contrario, también puede utilizar un semáforo, pero esto probablemente disminuiría la eficiencia y, si utiliza varios, incluso puede causar interbloqueos si no funciona correctamente.