Unikanie rywalizacji sterty
Menedżerowie ciąg domyślne MFC i ATL są proste otok na globalne sterty.To globalne sterty jest całkowicie wielowątkowość, co oznacza, że wiele wątków może przydzielić i zwolnić pamięć z niego jednocześnie bez uszkodzenia sterty.Aby zapewnić bezpieczeństwo wątków sterty ma szeregować dostęp do siebie.Zazwyczaj jest to realizowane za pomocą sekcji krytycznej lub podobny mechanizm blokowania.W każdym przypadku, gdy dwa wątki próby jednoczesnego dostępu sterty, jeden wątek jest zablokowane do momentu zakończenia żądania dla wątku.Ta sytuacja rzadko występuje wiele aplikacji i jest nieznaczny wpływ na wydajność sterty mechanizmu blokującego.Jednak aplikacje, które często dostęp do sterty z wielu wątków rywalizacji o blokadzie sterty może spowodować aplikacji działać wolniej niż Jeśli zostały jednowątkowe (nawet na maszynach wieloprocesorowych).
Aplikacje korzystające z CStringT są szczególnie podatne na stercie rywalizacji ponieważ operacji na CStringT obiektów często wymagają ponownego przydziału buforu ciągów.
Jednym ze sposobów złagodzenia sterty rywalizacji pomiędzy wątkami ma każdy wątek przydzielić ciągów ze stosu prywatne, lokalnej wątku.Jak ciągi przydzielone z przydzielania dla wątku są używane tylko w tym wątku, program przydzielania nie muszą być bezpieczne dla wątku.
Przykład
Poniższy przykład ilustruje procedury wątek, który przydziela własnych prywatnych stosu wątku odławiany dla ciągów w tym wątku:
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);
}
Komentarze
Wiele wątków może z systemem przy użyciu tej samej procedury wątku, ale ponieważ każdy wątek ma swój własny sterty nie ma rywalizacji pomiędzy wątkami.Ponadto fakt, że każdy sterty nie jest bezpieczne wątek daje wymierne wzrost wydajności, nawet jeśli tylko jedna kopia wątek jest uruchomiony.Jest to wynikiem sterty, nie używając kosztownych operacji blokujących ochrony przed dostępem współbieżnym.
Bardziej skomplikowane procedury wątek może być wygodne przechowywanie wskaźnik do Menedżera ciąg wątku w gnieździe magazynu lokalnego (TLS) wątku.Dzięki temu inne funkcje wywoływane przez procedurę wątek dostępu wątku ciąg menedżera.