Aracılığıyla paylaş


Öbek Çekişme kaçınma

mfc ve atl tarafından sağlanan varsayılan dize yöneticileri global öbek üzerinde basit sarıcıları.Bu genel yığın tamamen iş parçacığı birden çok iş parçacığı ayırma ve Öbek bozarak olmadan aynı anda bellekten onu serbest başka bir deyişle, uyumlu.İş parçacığı güvenliğini sağlamanıza yardımcı olmak amacıyla kendisine erişim seri hale getirmek yığın vardır.Bu genellikle bir kritik bölüm veya benzer kilitleme mekanizması ile gerçekleştirilir.İki iş parçacığı yığın aynı anda erişmek istediğinizde bir iş parçacığı diğer parçacığının isteği bitene kadar engellenir.Birçok uygulama için bu durum nadiren oluşur ve Öbek 's kilitleme mekanizması performansa olan etkileri önemsizdir.Ancak, birden çok iş parçacığı yığın sık erişen uygulamalar için yığın 's Çekişme uygulamanın tek iş parçacıklı (makinelerde bile birden çok CPU içeren) ise daha yavaş çalışmasına neden olabilir.

Kullanan uygulamalar CStringT öbek Çekişme özellikle açıktır çünkü işlemleri CStringT nesneleri sık dizesi arabelleği yeniden tahsisat gerekli.

Özel, iş parçacığı yerel öbekten dizelerini ayırmak her iş parçacığı için iş parçacıkları arasında öbek Çekişmesi zahmetinden yollarından biridir.Dizeleri ile ayrılmış olarak belirli bir iş parçacığının 's ayırıcısı yalnızca o iş parçacığı kullanılır, ayırıcı thread-safe olması gerekmez.

Örnek

Bu iş parçacığında dizeleri kullanmak için kendi özel iş parçacıklarını yığın ayırır bir iş parçacığı yordam aşağıdaki örnekte gösterilmiştir:

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);
}

Comments

Birden çok iş parçacığı çalışan iş parçacığı bu yordamı ancak her iş parçacığı kendi Kaçağı olduğundan hiçbir iş parçacıkları arasındaki çekişmeyi yoktur.Buna ek olarak, iş parçacığı yalnızca bir kopyası çalışıyor olsa bile her yığın iş parçacıklarını değil gerçeği ölçülebilir bir performans artışı sağlar.Eş zamanlı erişime karşı korumak için pahalı interlocked işlemlerini kullanmayan öbek sonucudur.

Daha karmaşık bir iş parçacığı yordamı için iş parçacığının dizesi Yöneticisi için bir işaretçi iş parçacığı yerel depolama (tls) yuvasında depolamak kullanışlı olabilir.Bu iş parçacığının dizesi Yöneticisi'ne erişmek için iş parçacığı yordam tarafından çağrılan diğer işlevler sağlar.

Ayrıca bkz.

Kavramlar

CStringT ile bellek yönetimi