2011-06-12 22 views
15

Bu sorunun bir kopya gibi göründüğünü biliyorum, fakat diğer soruları okuyarak cevap alamıyorum.C++ multithread güvenli yerel değişkenler?

Benim durumum - Visual C++ ekspres baskı stüdyosu + Windows sdk gelen derleyici 2005.

böyle bir işlev eğer Sadece bir soru:

void myFunc() 
{ 
    int i=0; 
    i++; 
} 

güvenlidir birden çok iş parçacığı aramaya?

Evet, öyle gibi görünüyor, ama derleyici i değişken bellekte statik olması yapmaz mı? Yani bu iki parçanın bir bellek bölgesinde birlikte hareket etmesine neden olabilir mi? Yoksa korkularım sadece bir aptal korkusudur? Ve tüm yerel değişkenler fonksiyonu çağırırken yaratıldı?

cevap

23

Evet, iş parçacığı güvenlidir. statik olmadığı için

i

, bellekte statik olmayacaktır. Eğer, diğer taraftan, sen yazmıştı:

void myFunc() 
{ 
    static int i = 0; 
    i++; 
} 

Sonra parçacığının güvenli olmaz (iyi, i aslında kullanıldıysa).

Yerel değişkenler tüm istif üzerinde bulunan (ya da kayıt tamamen canlı) vardır. Her bir iş parçacığının kendi yığını vardır ve kayıtlar her iş parçacığı için esas olarak yerel olacak şekilde işlenir (bkz. Context Switching), bu yüzden siz iyisiniz.

+0

Teşekkür ederim, Peter Alexander! – Evengard

5

Derleyici değişkenlerinizi statik yapamaz, çünkü bu programın anlamını değiştirir. Yalnızca yığınızda bildirilen değişkenlere bağlı kaldığınız sürece, iplik güvenliğini garanti edebilirsiniz.

1

@PeterAlexander, endişelendiğiniz durumu büyük olasılıkla yanıtladı, ancak güvenli olmayacağı başka bir durum da i'un global bir değişken olması.

7

Ve tüm yerel değişkenler işlevini çağırarak anında oluşturulur?

Yerel değişkenlerin tipik uygulaması, bunları yığında oluşturmaktır ve her bir iş parçacığının kendi yığını vardır, bu nedenle yerliler iyidir. Değişken bir kompleks tipi olduğunda statik veri veya küresel verilere faaliyet içindeki mantığı olabilir çünkü

dışarı izlemek zorunda sadece zaman vardır. En iyi yazılımlar elbette bunun gibi sınıflar yazmayı engeller.