2009-07-31 18 views
183

Karşılıklı dışlama sağlamak için @synchronized "kilitle" ve "kilit açma" kullanmıyor mu? O zaman nasıl kilitler/kilidini açar? Aşağıdaki programın çıkışı sadece "Merhaba Dünya" dır.Synchronized Objective-C'de kilitleme/kilit açma nasıldır?

+0

Not: http://stackoverflow.com/questions/1215765/ –

+10

ile ilgili. İhtiyacınız yoksa, init'i geçersiz kılmanız gerekmez. Bir yöntemi geçersiz kılmazsanız çalışma zamanı, üst sınıfın uygulanmasını otomatik olarak çağırır. –

+1

Dikkat edilmesi gereken önemli bir nokta, yukarıdaki kodun senkronize edilmemesidir. 'Lock' nesnesi her çağrıda yaratılır, bu yüzden bir' @ synchronized' bloğun diğerini kilitlediği bir durum asla olmayacaktır. Ve bu, karşılıklı bir dışlama olmadığı anlamına gelir.) Elbette, yukarıdaki örnek işlemi "ana" de yapıyor, bu yüzden dışarıda bırakılacak hiçbir şey yok, ama biri bu kodu başka bir yerde körü körüne kopyalamamalı. –

cevap

296

Objective-C dil düzeyi eşitlemesi, NSLock gibi muteks kullanır. Semantik olarak, bazı küçük teknik farklılıklar vardır, ancak bunları, ortak (daha ilkel) bir varlığın üstünde uygulanan iki ayrı arayüz olarak düşünmek temel olarak doğrudur.

Özellikle NSLock ile açık bir şifreniz vardır, oysa @synchronized ile senkronize etmek için kullandığınız nesneyle ilişkili gizli bir kilitiniz vardır. Dil seviyesi kilitlemenin yararı, derleyicinin, kapsam belirleme konularıyla uğraşabilmesi için bunu anlamasıdır, ancak mekanik olarak temelde aynı şekilde davranırlar.

Bir derleyici yeniden yazma olarak @synchronized düşünebilirsiniz

:

- (NSString *)myString { 
    @synchronized(self) { 
    return [[myString retain] autorelease]; 
    } 
} 

dönüşür: gerçek dönüşümü nedeniyle tam olarak doğru değil daha karmaşıktır ve özyinelemeli kilitleri kullanır

- (NSString *)myString { 
    NSString *retval = nil; 
    pthread_mutex_t *self_mutex = LOOK_UP_MUTEX(self); 
    pthread_mutex_lock(self_mutex); 
    retval = [[myString retain] autorelease]; 
    pthread_mutex_unlock(self_mutex); 
    return retval; 
} 

ama Bu noktadan geçmeli.

+17

Ayrıca Synchronized sizin için yaptığı istisna işleme unutmadan. Ve anladığım kadarıyla, bunların çoğu çalışma zamanında ele alındı. Bu, kontrolsüz kilitler, vb. Için optimizasyon sağlar. –

+5

Dediğim gibi, gerçek oluşturulan şeyler daha karmaşıktır, ama DWARF3 çözme tabloları oluşturmak için bölüm yönergeleri yazmak gibi hissetmedim ;-) –

+0

Ve ben suçlayamıyorum sen. :-) Ayrıca OS X'in DWARF yerine Mach-O formatı kullandığını unutmayın. –

-2

Sadece semaforu her nesne ile ilişkilendirir ve bunu kullanır.

+0

Teknik olarak, bir muteks kilidi oluşturur, ancak temel fikir doğrudur. Apple diva'ya bakın: http://developer.apple.com/documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW16 –

+3

Sadece muteks değil, özyinelemeli kilit. – kperryua

37

Objective-C'de, bir @synchronized blok, sizin için otomatik olarak kilitlenmeyi ve kilidin (yanı sıra olası istisnaların) açılmasını sağlar. Çalışma zamanı, dinamik olarak temel olarak senkronize ettiğiniz nesneyle ilişkilendirilmiş bir NSRecursiveLock oluşturur. This Apple documentation, daha ayrıntılı olarak açıklar. Eğer NSLock alt sınıf gelen günlük iletilerini görmüyoruz sebebi budur - Üzerinde senkronize nesne, sadece bir NSLock şey değil olabilir.

Temel olarak, @synchronized (...) kodunuzu düzenleyen bir kolaylık yapısıdır. En basitleştirilmesi soyutlamaların gibi, yükü (bir gizli maliyet olarak düşünmek) ilişkilendirilemez ve bunun farkında olmak iyidir, ama yine de bu tür yapılar kullanırken ham performans muhtemelen yüce amaç değildir etmiştir.

29

Aslında

{ 
    @synchronized(self) { 
    return [[myString retain] autorelease]; 
    } 
} 

doğrudan dönüştüren: iOS 2.0 beri mevcut

// needs #import <objc/objc-sync.h> 
{ 
    objc_sync_enter(self) 
    id retVal = [[myString retain] autorelease]; 
    objc_sync_exit(self); 
    return retVal; 
} 

Bu API ve ... kullanarak ithal

#import <objc/objc-sync.h> 
+0

Bu, atılan istisnaların temizliği için destek sağlamaz mı? – Dustin

+0

Bu bir yerde belgelenmiş mi? – jbat100

+6

Orada dengesiz bir ayraç var. – Potatoswatter

1

@synchronized Apple'ın uygulama açık kaynak ve here bulunabilir.o haritalar pthread_mutex_t kilitlere (tuş olarak hafıza adreslerini kullanarak) işaretçileri nesne bir tablo vardır

Özetle: Mike kül bu konuda iki gerçekten ilginç bir mesaj yazdı , gerektiği gibi kilitli ve kilidi açılmış.

İlgili konular