SORU
3 ŞUBAT 2010, ÇARŞAMBA


başvuru atama neden Kilitli yani atom.Exchange(ref Nesne, Nesne) gerekli mi?

Birden çok iş parçacığı asmx web hizmeti List<T> Dictionary<T> volatile olarak işaretlenmiş birkaç oluşan kendi tipim SystemData sınıf alan bir _allData vardı. Sistem verileri (_allData) arada bir yenilenir ve başka bir nesne newData adlı oluşturarak yapıyorum ve yeni veri ile veri yapıları var doldurun. Bittiğinde sadece atayın

private static volatile SystemData _allData

public static bool LoadAllSystemData()
{
    SystemData newData = new SystemData();
    /* fill newData with up-to-date data*/
     ...
    _allData = newData.
} 

Bu atama atom olduğu için çalışması gerektiğini ve eski veri referansı olan konuları kullanmaya devam ediyorum ve gerisi sadece atama sonra yeni sistem verileri var. Ancak meslekdaşım volatile anahtar kelime ve basit ödev yerine bazı platformlarda referans atama atom olduğunu garanti olmadığını söyledi çünkü InterLocked.Exchange kullanmam gerektiğini söyledi. volatile the _allData alanı ilan ediyorum . ayrıca:

Interlocked.Exchange<SystemData>(ref _allData, newData); 

üretir uyarı "uçucu bir alana başvuru uçucu olarak kabul edilir." ben bu konuda Ne yapmalıyım?

CEVAP
3 ŞUBAT 2010, ÇARŞAMBA


Çok sayıda soru var. Hepsini teker teker ele:

başvuru atama neden Kilitli yani atom.Exchange(ref Nesne, Nesne) gerekli mi?

Başvuru atama atom. Kilitli.Exchange sadece referans atama yapmaz. Bir değişkenin geçerli bir değer okunur mu, uzakta eski değeri düzenleme ve değişken, atomik işlem olarak yeni değer atar.

meslektaşım bazı platformlarda referans atama atom olduğunu garanti olmadığını söyledi. Meslektaşım doğru muydu?

Hayır. Başvuru atama tüm atom olması sağlanır .NET platformları.

Meslektaşım yanlış yerinden muhakeme. Bu sonuçlar onların yanlış olduğu anlamına mı geliyor?

Mutlaka değil. Arkadaşınız size kötü bir sebep için iyi bir tavsiye vermek olabilir. Belki de Kilitli kullanarak olmalısın neden başka bir nedeni var.Exchange. Kilidi serbest programlama delicesine zor ve otlar alanında köklü uygulamaları uzmanlar tarafından benimsenen, size hareket ve yarış koşulları daha kötü bir riske an. Bu alanda uzman ne de kodunuzu uzmanı ben ikisi de değilim, olamam bir karar öyle ya da böyle.

üretir uyarı "uçucu bir alana başvuru uçucu olarak kabul edilir." ben bu konuda Ne yapmalıyım?

Bu genel bir sorun olduğunu anlamak gerekir. Uyarı Bu durumda önemli değildir neden bir anlayış yol açacaktır.

Bunun nedeni, derleyici uyarı verir bu çünkü işaretleme alanı olarak uçucu "anlamına gelir bu alan olacak güncelleme birden çok iş parçacığı -- oluşturmaz herhangi bir kod önbelleğe değerler bu alan, ve emin olun herhangi bir okur ya da yazar bu alan değil "hareket ileriye ve geriye doğru zaman" ) işlemci önbellek tutarsızlıklar."

(O zaten senin anladığını varsayıyorum. Eğer uçucu ve işlemci önbellek semantiği nasıl etkilediğini anlamını çok detaylı bilgiye sahip değilse o zaman çalışır ve uçucu kullanılmamalı nasıl anlamıyorum. Kilidi Serbest Program çok zor değil; senin programın nasıl çalıştığını anlamak için doğru olduğundan emin olun, değil kazara.)

Şimdi bu alan bir hakem geçerek dalgalı bir alan takma adı olan bir değişken yapmak varsayalım. Olarak adlandırılan bu yöntem içinde derleyici referans uçucu mantığı gerektiğini bilmek için hiçbir neden yoktur! Derleyici neşeyle uçucu alanlar, ancak değişken için kuralları uygulamak için başarısız yöntemi için kod oluştururuçucu bir alan. Tamamen kilidi serbest mantığı altüst edebilir; varsayım uçucu bir alan olduğunu her zamanher zamanuçucu semantiği ile erişilebilir. Hiçbir şey anlayamıyorum bazen dalgalı ve diğer zamanlarda değil, tedavi etmek için yaparher zamandiğer erişir garantisi tutarlılık olamaz aksi halde tutarlı olun.

Bu nedenle, derleyici muhtemelen tamamen dikkatlice geliştirilen kilidi serbest mantığınız karışıklık oluyor çünkü, bunu ne zaman uyardı.

Elbette, Kilitli.Exchangeyazılı uçucu bir alan bekliyor ve doğru olanı yapmak. Uyarı Bu nedenle yanıltıcıdır. Bu duruma çok üzüldük; yapmamız gereken şey, bir yöntemin, bir yazarın Kilitli gibi mademki bir mekanizma uygulamak.Exchange yöntemi diyerek bir nitelik koyabilir "hakem aldığı bu yöntem, değişken uçucu semantik zorlar, o yüzden uyarıyı bastırmak". Belki de derleyici bir sonraki sürümünde bunu yapacağız.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • LearnCode.academy

    LearnCode.ac

    20 Aralık 2012
  • Paul Schroder

    Paul Schrode

    30 Kasım 2007
  • Xcode programming tutorials

    Xcode progra

    17 EYLÜL 2006