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

  • Excel Video Tutorials

    Excel Video

    6 Aralık 2012
  • Top Gear

    Top Gear

    27 Mart 2006
  • TWiT Netcast Network

    TWiT Netcast

    27 EKİM 2005