Ho la mia applicazione condivisa tra due thread nella versione std::list<Info> infoList
. Questi 2 fili accedono questa lista come segue:qual è il modo migliore per sincronizzare l'accesso del contenitore tra più thread nell'applicazione in tempo reale
filettatura 1: utilizza push_back()
, pop_front()
o clear()
nell'elenco (A seconda della situazione) filettatura 2: utilizza un iterator
per scorrere le voci del elencare e fare alcune azioni.
Thread 2 si iterazione della lista come la seguente:
for(std::list<Info>::iterator i = infoList.begin(); i != infoList.end(); ++i)
{
DoAction(i);
}
Il codice viene compilato utilizzando GCC 4.4.2.
A volte ++ i causa un segfault e causa l'arresto anomalo dell'applicazione. L'errore è causato in linea std_list.h 143 alla seguente riga:
_M_node = _M_node->_M_next;
immagino questa è una condizione di corsa. L'elenco potrebbe essere stato modificato o eliminato dal thread 1 mentre il thread 2 lo stava iterando.
Ho usato Mutex per sincronizzare l'accesso a questa lista e tutto è andato bene durante il mio test iniziale. Ma il sistema si blocca solo sotto stress test rendendo questa soluzione totalmente inaccettabile. Questa applicazione è un'applicazione in tempo reale e ho bisogno di trovare una soluzione in modo che entrambi i thread possano funzionare il più velocemente possibile senza danneggiare il throughput totale delle applicazioni.
La mia domanda è questa: Thread 1 e Thread 2 devono essere eseguiti il più rapidamente possibile poiché si tratta di un'applicazione in tempo reale. cosa posso fare per prevenire questo problema e mantenere comunque le prestazioni dell'applicazione? Esistono algoritmi privi di lock per questo tipo di problema?
Va bene se mi mancano alcuni oggetti Info
appena aggiunti nell'iterazione di thread 2, ma cosa posso fare per evitare che l'iteratore diventi un puntatore pendente?
Grazie
L'articolo di Sutters sulla scrittura di una coda senza blocco può aiutare: http://www.ddj.com/cpp/210604448 –
http://stackoverflow.com/questions/1724630/how-do-i-build- a-lockless-queue –
Perché non si può usare una coda invece di una lista? In che modo viene comunicata al thread del consumatore i nuovi oggetti Info? –