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?
cevap
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.
@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.
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. –
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 ;-) –
Ve ben suçlayamıyorum sen. :-) Ayrıca OS X'in DWARF yerine Mach-O formatı kullandığını unutmayın. –
Sadece semaforu her nesne ile ilişkilendirir ve bunu kullanır.
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 –
Sadece muteks değil, özyinelemeli kilit. – kperryua
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.
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>
Bu, atılan istisnaların temizliği için destek sağlamaz mı? – Dustin
Bu bir yerde belgelenmiş mi? – jbat100
Orada dengesiz bir ayraç var. – Potatoswatter
@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ış.
- 1. target-c: @synchronized, nasıl çalışır?
- 2. AdMob Kazançları - Hesaplamalar nasıldır?
- 3. Picker iPhone'da büyütme nasıldır?
- 4. Baskı başlangıçta akka yapılandırması nasıldır?
- 5. Boost :: variant mağaza referansları nasıldır?
- 6. Bit İşlemlerini takip etme şansı nasıldır?
- 7. Wordpress.com'da tema teması yükleme teması nasıldır?
- 8. Tıklama düğmesi tıklandığında stackoverflow biçimi textarea nasıldır?
- 9. SilverStripe'de oturum açma oturumu açma
- 10. Dosya açma modunda açma: open() API kullanarak
- 11. Kayan eylemi açma düzeninde açma düğmesi tıklat
- 12. UIView klipleriToBounds ve CALayer'ın maskeleriToBounds arasındaki ilişki nasıldır?
- 13. SSH kabuğuna gönderilen bir dizgede geri dönüş/tuşa basma nasıldır?
- 14. PHP betiğini kullanarak herhangi bir DOM'da sadece `-` çıkışı nasıldır?
- 15. Yalnızca üçlü boş satırları kaldırmak için sed kullanımı nasıldır?
- 16. Android oturum açma/oturum açma oturumunu nasıl yönetebilirim?
- 17. Oturum açma ve önceden oluşturulmuş oturum açma SessionManager sınıfı
- 18. Perl için okuma ve yazma (açma) için dosya açma
- 19. facebook oturum açma oauth kullanarak canlı sunucu açma başarısız
- 20. Oturum açma olayında Meteor.js
- 21. Dosya Açma (Tkinter)
- 22. SSH X11 Tünel Açma
- 23. JFileChooser ile dosya açma
- 24. WebView'de harici bağlantı açma
- 25. WebView'i arka planda açma
- 26. Google API oturumu açma
- 27. DBCP'de oturum açma
- 28. OpenCV kanal açma algılaması
- 29. Hibrid uygulamalarda belge açma
- 30. UnexpectedNullableFold sol oturum açma
Not: http://stackoverflow.com/questions/1215765/ –
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. –
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ı. –