Domanda

L'ho appena imparato in linguaggio C malloc La funzione presenta il problema del conflitto di thread quando viene utilizzata in applicazioni multi-thread.

In C++ lo fa operator new soffre dello stesso problema?Se sì, quale tecnica posso utilizzare per evitare ciò che sembra una grossa penalità nelle prestazioni dell'applicazione?

È stato utile?

Soluzione

Questo "problema" di filo contesa in realtà dipende l'attuazione. Alcune delle implementazioni di malloc di uso comune non sono stati originariamente progettati con multithreading in mente. Ma un'implementazione malloc progettato per applicazioni multithread non dovrebbe soffrire di contesa in circostanze normali.

Come esempio di un'implementazione malloc progettato con multithreading in mente, sguardo jemalloc .

Altri suggerimenti

A seconda delle implementazioni di new, ma poiché di solito è basato su malloc, sì.Ecco alcune cose che puoi fare:

  • Utilizzare un profiler per contare il numero di chiamate a malloc() (e forse brk()) al secondo, assicurati di avere un problema di contesa con malloc().
  • Prova a lavorare con un allocatore di memoria parallelo (es. tesoro)
  • Usa lo stack ogni volta che è possibile:non chiamare nuovo quando non è necessario.Ricorda inoltre che le copie di piccole dimensioni sono generalmente più adatte alla cache rispetto ai puntatori e ai dati condivisi tra i thread.
  

In C ++ non operatore nuova soffre lo stesso problema?

Sì, nella maggior parte delle implementazioni, lo fa.

Se siete in C ++ già, Threading Building Blocks è una libreria di template C ++ che dovrebbe adattarsi I tuoi bisogni. Ha ripartitori scalabili, strutture di dati, una sito e molto altro ancora ...

Il problema con filettatura contesa malloc scende semplicemente che il cumulo deve essere protetto da un mutex di dispositivo analogo ogni eventuale aggiornamento. Se due thread aggiornano mucchio contemporaneamente si avrà una condizione di competizione. Lo stesso problema si applica ai nuovi quindi non c'è ragione fondamentale per cui si dovrebbe avere meno contese di quello successivo.

Detto questo, ci sono una serie di trucchi per ridurre al minimo contesa. Il primo è quello di rompere il mucchio fino in Arenas separati. Ogni Arena ha il suo blocco. Se un thread tenta di allocare la memoria e quella Arena è bloccato, cerca solo di allocare fuori la prossima Arena.

Frees sarà necessario accedere alla stessa Arena che è stato utilizzato per un malloc. Questo può anche essere ottimizzata posto il puntatore per essere liberati su una lista libera. Questo può essere fatto in modo atomico. La prossima l'Arena si sblocca, tutti i puntatori della lista libera avranno liberato correttamente.

Queste tecniche aiutano a prevenire, ma non elimina la contesa che significa in un modello di threading produttore consumatore, si può essere meglio avere i puntatori passa consumatore al produttore, dove possono essere riutilizzati o eliminati a seconda dei casi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top