2011-03-17 12 views
6

Java kodunu Objective C koduna dönüştürmeye çalışıyorum. Ve java kodu, uçucu olarak tanımlanan değişkenleri içerir. Ben değişkenler sonra ihtiyacım yok farklı iş parçacıkları tarafından erişilebilir olacak çünkü Objective C uçucu olarak değişkenleri ayarlamak için gidiyordu, YaniAmaç C, Java'da geçici C nesnesine dönüştürmenin en iyi yolu nedir?

Essentially, volatile is used to indicate that a variable's value will be modified by different threads. 

follwing olarak java ve "uçucu" kullanım çevrimiçi baktım Bu değişkenleri uçucu olarak ayarlamak için bu değişkenleri atomik olarak ayarlayabilirim çünkü?

+0

Aslında Objective-C eşdeğer bilmiyorum ama Java "uçucu" bölünmezlik ilgili olmadığını ben söyleyebilirim: Bu önbelleğe alma hakkında. Bir uçucu üye değişkeni bir kayıtta önbelleğe alınmayacak, bunun yerine her seferinde değere ihtiyaç duyulduğunda bellekten getirilecektir. –

+2

Bu 'Objective-C volatile' ihtiyacı son derece nadir olduğu (hemen hemen donanım adresleme için). Uçucuya ihtiyaç duyduğunuzu düşünüyorsanız, yanlış yaptığınız her zaman böyle olur. – bbum

cevap

18

volatile anahtar sözcüğü Objective-C'de de bulunmaktadır. Kullanabilirsin.

Objective-C volatile yapmak gereken şey düzeltmez atomic gibi özellikleri bildirme C

bir üst

olmasıdır. volatile, derleyicinin bu değişkende yapılan denetimleri en iyi duruma getirmemesini etkili bir şekilde anlatır, çünkü derleyici aynı kalmasını beklerken değişmiş olabilir.

En basit örnek şudur. daha sonra böyle kullanılır

int packetsReceived = 0; 

Ve:

packetsRecieved = 0; 

while (packetsRecieved < 10){ 
    //Wait for more packets 
} 

processPackets(); 

derleyici "Hey diyecekler, çünkü o halkanın içinden asla, packetsRecieved modifiye asla biz global bir değişken ilan var ki Bu döngüde sonsuz olarak çalışır. Sonuç olarak, sadece düz bir sonsuz döngü yapar, böylece her seferinde kontrol etmek zorunda kalmaz. Biz aynı kalmalıdır gibi görünsem de bu değişken, herhangi bir zamanda değişebilir derleyici anlatıyorsun

volatile int packetsRecieved; 

: olarak yerine değişken ilan olsaydı

. Örneğimizde, derleyici tarafından üretilen makine kodu hala koşulu kontrol edecek ve programımız beklendiği gibi çalışacaktır.

+1

Paketler başka bir iş parçacığı tarafından nasıl değiştirilir? Bu sadece yerel bir değişken. Başka bir iş parçacığı buna nasıl erişir? – JoJo

+0

İyi nokta @JoJo. Güncellenmiş. –

7
Hayır, atomic ve volatile aynı şey değildir.

atomic (bir özellik beyanında), alıcı/belirleyicinin, diğer iş parçacıklarının eşzamanlı olarak yaptıklarından bağımsız olarak, tam bir değerin ayarlanmasını/ayarlanmasını sağlar.

volatile derleyicinin bir değişkenin başka yollarla (diğer iş parçacıkları, bellek eşlemli IO aygıtları) değiştirilebildiğini gösteren bir göstergedir, bu nedenle bu değişkenin gereksiz yüklerini/depolarını optimize etmemelidir. Java'da ne anlama geldiğine benzer, ancak Java bellek engelleri ve C (ve Objective-C) sağlanmayan okuma ve yazma emirleri hakkında bazı güvenceler ekler. Özellikle, C içinde, volatile değişkenini bildirmek, wikipedia:volatile variable çoklu dişlerinden güvenle kullanmak için yeterli değildir.

0

Farklı nesneler arasında değişebilen nesnelerin paylaşılması büyük bir baş ağrısı olabilir ve izlenmesi zor olan hatalara neden olabilir. Objektif-c, değişmez nesneler için büyük bir tercihe sahiptir. Mümkünse, eğer mümkünse bunun yerine değişmez nesnelerin etrafından geçmenin bir yolunu bulursun. Öyleyse, paylaşılan bir nesne hakkında hiç endişelenmenize gerek yok.

İlgili konular