ios - мультитрединг - различия @synchronized() и NSLock




мультитрединг в ios (2)

В блоге Google Mac есть замечательная запись в блоге о внутренней работе @synchronized :
http://googlemac.blogspot.com/2006/10/synchronized-swimming.html

В настоящее время я использую блок @synchronized (self) {}, но я не уверен, что это обеспечивает правильную защиту. Как он отличается от экземпляра NSLock?

Существует несколько способов синхронизации критических разделов ( @synchronized, NSLock, OSSpinLock, ... ).
Я думаю, что @synchronized - самый удобный ( и самый медленный ) подход.
Вот хороший ответ SO , объясняющий различия между @synchronized и NSLock.

Вы получаете доступ к вашему методу через делегат с общим экземпляром (который в основном является одиночным). Возможно, вы можете переосмыслить свой дизайн и выяснить способ, который позволяет блокировать меньшую часть кода в myMethod .

У меня есть блок кода, к которому часто обращаются, и из основного потока или нескольких других потоков фона. Мне нужно убедиться, что этот код обрабатывается только по одному.

В настоящее время я использую блок @synchronized(self) { } но я не уверен, что это обеспечивает правильную защиту. Как он отличается от экземпляра NSLock ?

Наконец, может ли кто-нибудь предложить, как я могу защитить свой метод? Этот метод находится в моем делете приложения, и я обращаюсь к нему из разных потоков, вызывая:

[[[UIApplication sharedApplication] delegate] myMethod];

Большое спасибо,

Майк


Если у вас действительно есть что-то, что вы хотите обрабатывать по одному элементу за раз, я рекомендую использовать NSOperations и NSOperationQueue, где вы установили maxConcurrentOperationCount равным 1. Если вы убедитесь, что единственный способ, которым этот общий блок доступ к коду осуществляется через операции в этой очереди, вы избавитесь от необходимости дорогостоящих шлюзов.

Это может потребовать небольшой реорганизации вашего приложения, но я обнаружил, что применение этого в моих собственных приложениях привело к повышению производительности и более чистого кода.







multithreading