@Synchronized () hedef C'de tekil yöntem olarak ne yapar?


88

Az önce bir singleton metodu oluşturdum ve @synchronized()sık kullandığım ama anlamını bilmediğim için fonksiyonun ne yaptığını bilmek istiyorum .

Yanıtlar:


119

Kod bloğu etrafında kritik bir bölüm bildirir . Çok iş parçacıklı kodda, @synchronizedherhangi bir zamanda blokta yalnızca bir iş parçacığının bu kodu çalıştırabileceğini garanti eder.

Ne yaptığının farkında değilseniz, o zaman uygulamanız muhtemelen çok iş parçacıklı değildir ve muhtemelen kullanmanız gerekmez (özellikle de tekil iş parçacığı güvenli değilse).


Düzenleme: 2011'deki orijinal cevapta olmayan bazı bilgiler ekleniyor.

@synchronizedYönergesi bir ile korunmaktadır kod herhangi bir bölgeye girmesini birden fazla konu engeller @synchronizeddirektifi aynı nesneye atıfta . Yönergeye iletilen @synchronizednesne, "kilit" olarak kullanılan nesnedir. Kilit olarak farklı bir nesne kullanılıyorsa, iki iş parçacığı aynı korumalı kod bölgesinde olabilir ve kilitle aynı nesneyi kullanarak tamamen farklı iki kod bölgesini de koruyabilirsiniz.

Ayrıca, nilkilit nesnesi olarak geçerseniz , hiçbir kilit alınmayacaktır.


14
Birkaç önemli nokta: 1) Eğer bir sıfır işaretçisi kullanırsanız @synchronizedhiçbir şey yapmaz - korumasız kalırsınız. 2) @synchronizedbir yavaş .
Hot Licks

Bu cevap yanıltıcıdır ve kabul edilen cevap olmamalıdır. Her ne kadar söylediği bazen doğru olsa da ( synhronized'a aktarılan belirteç tüm iş parçacıklarında aynı nesne olduğu sürece ), yanıltıcı bir şekilde eksiktir. senkronizasyon , sadece "bloktaki kodun" değil, herhangi bir sayıda ilişkili kod bölümünün aynı anda yürütülmesini engeller. Etkili bir şekilde senkronize edilecek parametre , kodun hangi bölümlerinin (veya yanıt onları çağırırken "blokların") eşzamanlı erişimden korunacağını belirler.
Arda

@Arda Tamamen haklısın. Biraz daha fazla bilgi ve hakkında bazı Apple belgelerine bir bağlantı ekledim @synchronized.
John Calsbeek

@JohnCalsbeek, cevap şimdi çok daha iyi görünüyor. Benden parmak yukarı.
Arda

@HotLicks bunu belirtmek için ilginçti, ancak alternatiflerin neler olabileceğini kısaca söylemek daha iyi olurdu (bağlantılar?)
itMaxence

43

Buradaki ve buradaki Apple belgelerinden :

@Synchronized yönergesi, Objective-C kodunda anında muteks kilitler oluşturmanın uygun bir yoludur. @Synchronized yönergesi diğer herhangi bir muteks kilidinin yapacağını yapar — farklı evrelerin aynı anda aynı kilidi edinmesini engeller.

Belgeler, bu konu hakkında zengin bilgi sağlar. Okumak için zaman ayırmaya değer, özellikle de ne yaptığını bilmeden kullandığınız göz önüne alındığında.


27

@synchronizedDirektifi içinde anında muteksin kilitleri oluşturmak için uygun bir yoldur Objective-C kodu.

@synchronizedYönerge-do herhangi başka muteks kilidi ne yapar aynı anda aynı kilidi alınıyor farklı konuları engeller.

Sözdizimi:

 @synchronized(key) 
 { 
  // thread-safe code 
 }

Misal:

 -(void)AppendExisting:(NSString*)val
{
  @synchronized (oldValue) {
      [oldValue stringByAppendingFormat:@"-%@",val];
  }
}

Şimdi yukarıdaki kod tamamen iş parçacığı güvenlidir .. Şimdi Birden çok iş parçacığı değeri değiştirebilir.

Yukarıdakiler sadece belirsiz bir örnek ...


3
@Synchronized (oldValue) olması gerekmez mi?
Joel

Veya hatta @synchronized(val, oldValue) { ... }?
Valentin Shergin

"İş parçacığı için tamamen güvenli" olan herhangi bir plan gördüğümden emin değilim. En azından, ne yaptığınızı bilmeniz ve sadece körü körüne bir yerden kod kopyalamamalısınız.
Hot Licks

Ama sanırım yukarıdaki kod kesinlikle hiçbir şey yapmadığı için "tamamen iş parçacığı güvenli" dir.
Hot Licks



-2

@synchronizedolan thread safemekanizma. Bu işlevin içinde yazılan kod parçası,critical section , aynı anda yalnızca bir iş parçacığının çalıştırılabileceği .

@synchronize kilidi örtük olarak uygularken NSLock açıkça uygular.

Sadece iplik güvenliğini garanti eder, bunu garanti etmez. Demek istediğim, arabanız için uzman bir şoför kiralamak, yine de arabanın bir kaza ile karşılaşmayacağını garanti etmiyor. Ancak olasılık en ufaktır.


2
Bu kesinlikle yanlış. dispatch_once @syncrhonized ile aynı şeyi YAPMAZ, YALNIZCA bir singleton tahsisi altında bir ikame olabilir.
jugutier
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.