2010-03-17 17 views
22
__thread Foo foo; 

"foo" aslında nasıl çözülür? Derleyici, "foo" nun her örneğini bir işlev çağrısı ile sessizce değiştirir mi? "Foo", yığının tabanına göre bir yerde depolanır ve derleyici bunu "her bir iş parçacığı için, yığının en altında bu boşluğa sahip olur ve foo" yığının altından "offset x" olarak depolanır. "?Linux'un iş parçacığı yerel depolama gerçekleştirme

cevap

26

Biraz karmaşık (this document ayrıntılı olarak açıklar), ancak temelde ikisi de değil. Bunun yerine derleyici, tüm iş parçacığı yerel değişkenlerini içeren, yürütülebilir bir özel .tdata bölümü koyar. Çalışma zamanında, her bir iş parçacığı için yeni bir veri bölümü (salt okunur) .tdata bölümündeki verilerin bir kopyası ile oluşturulur ve iş parçacıkları çalışma zamanında değiştirildiğinde, bölüm otomatik olarak da değiştirilir.

Sonuç olarak, __thread değişkenler normal değişkenler kadar hızlıdır ve fazladan yığın alanı almazlar.

+0

Birden çok iş parçacığım varsa ancak yalnızca bir çekirdek varsa bunun nasıl çalıştığını görebiliyorum. Çok iş parçacıklı ve çok çekirdekli olduğunda, bu .tdata bölümü nasıl çalışır? – anon

+0

@anon: İkinci davasında ne gibi farklılıklar görüyorsunuz? –

+0

zaman 01: çekirdek 1 iş parçacığı 1'i çalıştırır; iş parçacığı 1'in .tdata'daki takaslar; zaman 02: çekirdek 2 iş parçacığı 2'yi çalıştırır; iplik 2'nin .tdata'daki takaslar; Şimdi thread1 aniden thread2's .tdata kullanıyor? – anon

İlgili konular