Да, безопасно использовать NSLock
из любого потока, включая основной поток. Единственное ограничение с NSLock
состоит в том, что вы должны разблокировать его из того же потока, который вы заблокировали, что вы делаете здесь.
NSLock
заблокирует основной поток или это безопасноиспользовать в главном потоке?
Очевидно, что если вы заблокируете основной поток на длительный период времени, это будет проблематично. Поэтому убедитесь, что вы всегда входите и выходите очень быстро. Всегда избегайте блокировок (или блокировок) на любой длительный период времени.
Также это та же самая ситуация с DispatchSemaphore
и следует прибегать к очередям?
Любая синхронизацияМеханизм может блокировать поток, из которого они используются, поэтому он в значительной степени проблематичен независимо от механизма синхронизации. DispatchSemaphore
или в последовательных очередях GCD обе будут иметь ту же проблему, что и этот шаблон блокировки.
Вы всегда можете использовать шаблон чтения-записи, который немного смягчает это (когда он допускает одновременное чтение и только блокирует запись).
Но, как правило, ограничивайте объем работы механизма синхронизации. Например, если вы делаете что-то дорогое, делайте как можно больше в локальных сетях с конкретным потоком и синхронизируйте только окончательное обновление общего ресурса.