SORU
31 Temmuz 2009, Cuma


Nasıl @kilit senkronize/Objective-C kilidini mı?

@Senkronize" ve "karşılıklı dışlama elde etmek için? kilidini "lock kullanmak değil mi Nasıl kilit/kilidini sonra mı?

Aşağıdaki programın çıktısı sadece "Merhaba Dünya".

@interface MyLock: NSLock<NSLocking>
@end

@implementation MyLock

- (id)init {
    return [super init];
}

- (void)lock {
    NSLog(@"before lock");
    [super lock];
    NSLog(@"after lock");
}

- (void)unlock {
    NSLog(@"before unlock");
    [super unlock];
    NSLog(@"after unlock");
}

@end


int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    MyLock *lock = [[MyLock new] autorelease];
    @synchronized(lock) {
        NSLog(@"Hello World");
    }

    [pool drain];
}

CEVAP
1 AĞUSTOS 2009, CUMARTESİ


Objective-C dil seviyesi senkronizasyon NSLock yaptığı gibi, zaman uyumu kullanır. Anlamsal bazı küçük teknik farklılıklar vardır, ama iki ayrı arayüzleri (daha fazla) ilkel ortak bir varlık üzerine uygulanan olarak düşünmek temelde doğru.

@synchronized oysa açık bir Kilidi var NSLock ile özellikle örtülü bir kilit eşitlemek için kullandığınız nesne ile ilişkili vardır. Dil düzeyi yararı kilitleme derleyici kapsayan konularda ki anlar, ama mekanik olarak onlar temelde aynı şekilde davranır.

Bir derleyici olarak @synchronized düşün yeniden yazabilirsiniz:

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

dönüşü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;
}

Bu gerçek bir dönüşüm daha karmaşık ve özyinelemeli kilitleri kullanır, çünkü tam olarak doğru değil, ama genelinde noktası almak gerekir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • cdgotx

    cdgotx

    8 Kasım 2011
  • jbignacio

    jbignacio

    13 Mart 2006
  • Joseph Hayhoe

    Joseph Hayho

    20 Mayıs 2010