İş parçacığı yerel depolaması statiktir ancak basit statik depolamadan oldukça farklı davranır.
Bir statik değişkeni bildirdiğinizde, değişkenin tam olarak bir örneği vardır. Derleyici / çalışma zamanı sistemi, tam olarak ne zaman belirtilmeden (bazı ayrıntılar burada atlanmıştır), onu gerçekten kullanmadan bir süre önce sizin için başlatılacağını garanti eder.
C ++ 11, bu başlatmanın iş parçacığı açısından güvenli olacağını garanti eder, ancak C ++ 11'den önce bu iş parçacığı güvenliği garanti edilmemiştir. Örneğin
static X * pointer = new X;
Birden fazla iş parçacığı aynı anda statik başlatma koduna ulaşırsa X'in örneklerini sızdırabilir.
Yerel bir değişken iş parçacığı bildirdiğinizde, değişkenin potansiyel olarak birçok örneği vardır. Onları thread-id tarafından indekslenmiş bir haritada olarak düşünebilirsiniz. Bu, her iş parçacığının değişkenin kendi kopyasını gördüğü anlamına gelir.
Bir kez daha, değişken başlatılırsa, derleyici / çalıştırma zamanı sistemi bu başlatmanın veriler kullanılmadan önce gerçekleşeceğini ve değişkeni kullanan her iş parçacığı için başlatmanın gerçekleşeceğini garanti eder. Derleyici ayrıca başlatmanın iş parçacığı açısından güvenli olacağını garanti eder.
İş parçacığı güvenliği garantileri, değişkenin beklediğiniz gibi davranmasını sağlamak için epeyce perde arkası kodu olabileceği anlamına gelir - özellikle derleyicinin önceden tam olarak kaç iş parçacığının olacağını bilmesinin bir yolu olmadığını düşünürsek programınızda var ve bunlardan kaç tanesi iş parçacığı yerel değişkenine dokunacak.
thread_local
Yerel bir değişkene sahip olmak , başlamak için mantıklı değil… her evrenin kendi çağrı yığını vardır.