Tengo std::list<Info> infoList
en mi aplicación que se comparte entre dos subprocesos. Estos 2 hilos están accediendo a esta lista como sigue:cuál es la mejor manera de sincronizar el acceso al contenedor entre varios subprocesos en la aplicación en tiempo real
Thread 1: utiliza push_back()
, pop_front()
o clear()
en la lista (Dependiendo de la situación) Thread 2: utiliza un iterator
para iterar a través de los elementos de la enumera y haz algunas acciones.
Tema 2 está iterando la lista como la siguiente:
for(std::list<Info>::iterator i = infoList.begin(); i != infoList.end(); ++i)
{
DoAction(i);
}
El código se compila usando GCC 4.4.2.
A veces ++ i causa una segfault y bloquea la aplicación. El error se produce en la línea 143 std_list.h en la siguiente línea:
_M_node = _M_node->_M_next;
creo que esto es una condición de carrera. La lista podría haber cambiado o incluso borrado por el subproceso 1 mientras el subproceso 2 la iteraba.
Utilicé Mutex para sincronizar el acceso a esta lista y todo fue bien durante mi prueba inicial. Pero el sistema simplemente se congela bajo la prueba de estrés, lo que hace que esta solución sea totalmente inaceptable. Esta aplicación es una aplicación en tiempo real y necesito encontrar una solución para que ambos subprocesos puedan ejecutarse lo más rápido posible sin dañar el rendimiento total de las aplicaciones.
Mi pregunta es esta: El hilo 1 y el hilo 2 deben ejecutarse lo más rápido posible ya que esta es una aplicación en tiempo real. ¿Qué puedo hacer para evitar este problema y aún mantener el rendimiento de la aplicación? ¿Hay algún algoritmo libre de bloqueos disponible para tal problema?
Está bien si omito algunos objetos Info
recientemente agregados en la iteración de la cadena 2, pero ¿qué puedo hacer para evitar que el iterador se convierta en un puntero colgante?
Gracias
El artículo de Sutters sobre cómo escribir una cola sin bloqueo podría ayudar: http://www.ddj.com/cpp/210604448 –
http://stackoverflow.com/questions/1724630/how-do-i-build- a-lockless-queue –
¿Por qué no puedes usar una cola en lugar de una lista? ¿Cómo se notifica a su cadena de consumidores los nuevos objetos Info? –