Sto provando a progettare un elenco collegato in C++ che consente l'accesso simultaneo. Chiaramente l'uso di un singolo blocco per questa lista è grossolanamente inefficiente poiché le aree disgiunte possono essere aggiornate in parallelo. Ora quali sono le mie opzioni oltre alla memorizzazione di un blocco per nodo?elenco concomitante collegato
Inoltre, una versione non bloccante sarebbe una scommessa migliore in questo caso? Qualche link pertinente, chiunque?
EDIT: Grazie per le risposte. Un paio di cose che vorrei aggiungere:
- Che ne dici di memorizzare i blocchi N per ogni nodo M invece del blocco 1: 1: rapporto nodo? Alcuni thread attenderanno, ma è una specie di compromesso. Cosa ne pensi?
- Se ho intenzione di trovare un nodo in questo elenco collegato sembra che tutti i mutex debbano essere bloccati. Questo è un problema, perché il blocco e lo sblocco di tutti i mutex richiede molto tempo. Qualcuno ha un'alternativa migliore?
- Sono aperto ad algoritmi non bloccanti. Ma come faccio a usare CAS nel buon vecchio C++ senza usare l'assembly? Ho sentito che gcc ha alcuni attributi __sync che funzionano in modo simile ma non sono sicuri.
- Con approccio non bloccante, come si fa una ricerca nell'elenco collegato?
Considerare l'utilizzo di qualcosa che esiste già al posto di reinventare questa ruota. Un esempio potrebbe essere 'concurrent_vector' da Intel TBB: http://www.threadingbuildingblocks.org/ –
Potrebbe anche esserci una soluzione Boost - Non ne sono sicuro. –