Цель C NSLock: блокировать и разблокировать NSLock в разных потоках - PullRequest
4 голосов
/ 23 июня 2011

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

Документация Apple гласит:

Предупреждение: класс NSLock использует POSIX потоки для реализации его блокировки поведение. При отправке разблокировки сообщение для объекта NSLock, вы должны убедитесь, что сообщение отправлено с тот же поток, который отправил начальную блокировку сообщение. Разблокировка замка от другой поток может привести к неопределенное поведение.

Как мне избежать этого "неопределенного поведения" и заставить его работать как положено?

Ответы [ 3 ]

6 голосов
/ 23 июня 2011

Еще лучше;используйте NSOperationQueue или очередь GCD в качестве примитива синхронизации.

Блокировки дороги, а семафоры, более или менее, блокируют счетчик.

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

3 голосов
/ 23 июня 2011

Используйте NSCondition для этого, чтобы сигнализировать другим потокам, что они могут безопасно проходить сейчас.

3 голосов
/ 23 июня 2011

Не используйте мьютекс для этого.Используйте семафор, инициализированный в 1, или какой-либо другой механизм блокировки, который позволяет межпоточную связь / блокировку.

Rgds, Martin

...