Evitare conflitti dell'heap
Gli amministratori predefiniti della stringa fornita da MFC e da ATL sono wrapper semplici in un heap globale.Questa heap globale è completamente thread-safe, pertanto i thread possono provocare allocare e liberare memoria da senza danneggiare heap.Per fornire il thread safety, l'heap serializzi l'accesso se stesso.A tale scopo si utilizza in genere una sezione critica o un come meccanismo di blocco.Ogni volta che due thread tentano di accedere contemporaneamente a heap, un thread è bloccato fino alla richiesta completamento dell'altro thread.Per molte applicazioni, questa situazione si verifica raramente e l'impatto sulle prestazioni del meccanismo di blocco dell'heap è trascurabile.Tuttavia, per le applicazioni che accedono frequentemente l'heap dai conflitti dei thread di blocco dell'heap può condurre l'applicazione essere più lenta di se fosse a thread singolo (anche nei computer con più CPU).
Le applicazioni che utilizzano CStringT sono particolarmente soggette risolte nel conflitto in quanto le operazioni sugli oggetti CStringT richiedono frequente riallocazione del buffer di stringa.
Un modo per alleviare il conflitto dell'heap tra thread consiste ogni allocazione thread stringhe da un heap privata e di thread locale.Se le stringhe allocate con l'allocatore di un particolare thread vengono utilizzate solo in tale thread, l'allocatore non deve essere thread-safe.
Esempio
Nell'esempio seguente viene illustrata una routine del thread che alloca la propria heap non thread-safe privata da utilizzare per le stringhe su tale thread:
DWORD WINAPI WorkerThreadProc(void* pBase)
{
// Declare a non-thread-safe heap just for this thread:
CWin32Heap stringHeap(HEAP_NO_SERIALIZE, 0, 0);
// Declare a string manager that uses the thread's heap:
CAtlStringMgr stringMgr(&stringHeap);
int nBase = *((int*)pBase);
int n = 1;
for(int nPower = 0; nPower < 10; nPower++)
{
// Use the thread's string manager, instead of the default:
CString strPower(&stringMgr);
strPower.Format(_T("%d"), n);
_tprintf_s(_T("%s\n"), strPower);
n *= nBase;
}
return(0);
}
Commenti
I thread potrebbero essere in esecuzione utilizzando la stessa routine del thread ma poiché ogni thread dispone dell'heap non esistono conflitti tra i thread.Inoltre, il fatto che ogni heap non è thread-safe fornisce un aumento miglioramento delle prestazioni anche se solo una copia del thread è in esecuzione.È il risultato dell'heap non tramite operazioni interlock costose da proteggere dall'accesso simultaneo.
Per una routine del thread più complessa, può essere utile memorizzare un puntatore all'amministratore di stringa del thread in uno slot (TLS) di memoria locale di thread.Ciò consente altre funzioni chiamate dalla routine del thread per accedere a gestione delle stringhe di thread.