Burada çok sayıda soru var. Onları teker teker ele alarak:
referans ataması atomiktir, öyleyse neden Interlocked.Exchange (ref Object, Object) gerekli?
Referans ataması atomiktir. Interlocked.Exchange sadece referans ataması yapmaz. Bir değişkenin mevcut değerini okur, eski değeri saklar ve yeni değeri değişkene atomik bir işlem olarak atar.
meslektaşım, bazı platformlarda referans atamasının atomik olduğunun garanti edilmediğini söyledi. Meslektaşım doğru muydu?
Hayır. Referans atamasının tüm .NET platformlarında atomik olacağı garanti edilir.
Meslektaşım yanlış önermelere dayanarak muhakeme ediyor. Bu, sonuçlarının yanlış olduğu anlamına mı geliyor?
Şart değil. Meslektaşınız size kötü nedenlerle iyi tavsiyeler veriyor olabilir. Belki de Interlocked.Exchange'i kullanmanız için başka bir neden daha vardır. Kilitsiz programlama delicesine zordur ve alandaki uzmanlar tarafından benimsenen köklü uygulamalardan ayrıldığınız anda, yabani otlara gömülür ve en kötü türden yarış koşullarını riske atarsınız. Ben ne bu alanda uzmanım ne de kodunuz konusunda uzmanım, bu yüzden öyle ya da böyle bir yargıya varamam.
uyarı verir "uçucu bir alana yapılan bir referans geçici olarak değerlendirilmeyecektir" Bu konuda ne düşünmeliyim?
Bunun genel olarak neden bir sorun olduğunu anlamalısınız. Bu, bu özel durumda uyarının neden önemsiz olduğunun anlaşılmasına yol açacaktır.
Derleyicinin bu uyarıyı vermesinin nedeni, bir alanı geçici olarak işaretlemenin "bu alanın birden çok iş parçacığında güncelleneceği anlamına gelmesidir - bu alanın değerlerini önbelleğe alan herhangi bir kod oluşturmayın ve herhangi bir okuma veya yazma işleminin yapıldığından emin olun. bu alan, işlemci önbelleği tutarsızlıkları nedeniyle "zamanda ileri ve geri taşınmaz". "
(Her şeyi zaten anladığınızı varsayıyorum. Eğer uçucunun anlamını ve işlemci önbelleği anlamını nasıl etkilediğini ayrıntılı olarak anlamadıysanız, nasıl çalıştığını anlamıyorsunuz ve geçici kullanmamalısınız. Kilitsiz programlar doğru yapmak çok zordur; programınızın doğru olduğundan emin olun çünkü nasıl çalıştığını anlıyorsunuz, tesadüfen değil.)
Şimdi, geçici bir alanın takma adı olan bir değişkeni o alana bir ref geçirerek yaptığınızı varsayalım. Çağrılan yöntemin içinde, derleyicinin referansın geçici anlambilimlere sahip olması gerektiğini bilmesi için hiçbir nedeni yoktur! Derleyici neşeyle uçucu alanlar için kuralları uygulamak başarısız yöntemi için kod oluşturur, fakat değişken olan uçucu bir alan. Bu, kilitsiz mantığınızı tamamen mahvedebilir; varsayım her zaman uçucu bir alana her zaman geçici anlambilimle erişildiği şeklindedir. Onu bazen uçucu, bazen de uçucu olarak ele almanın hiçbir anlamı yoktur; her zaman tutarlı olmanız gerekir, aksi takdirde diğer erişimlerde tutarlılığı garanti edemezsiniz.
Bu nedenle, derleyici bunu yaptığınızda uyarır, çünkü muhtemelen dikkatlice geliştirdiğiniz kilitsiz mantığınızı tamamen bozacaktır.
Tabii ki, Interlocked.Exchange olan uçucu bir alan elde etmek için yazılan ve doğru olanı yap. Bu nedenle uyarı yanıltıcıdır. Buna çok pişmanım; Yapmamız gereken şey, Interlocked.Exchange gibi bir yöntemin yazarının yönteme "ref alan bu yöntem değişken üzerinde uçucu semantiği zorlar, bu nedenle uyarıyı bastırın" diyerek bir öznitelik koyabileceği bir mekanizma uygulamaktır. Belki de derleyicinin gelecekteki bir sürümünde bunu yapacağız.