GCD Swift 4 поток безопасности - PullRequest
0 голосов
/ 26 мая 2018

У меня есть функция, которая контролирует некоторые ресурсы, например:

var resource: Int?

func changeSomeResources() {
    resource = 1
    // rewriting keychain parameters
    // working with UIApplication.shared
}

Затем я добавляю эту функцию в глобальный поток несколько раз

DispatchQueue.global(qos: .userInitiated).async {
    changeSomeResources()
}
DispatchQueue.global(qos: .userInitiated).async {
    changeSomeResources()
}

Могу ли я получить некоторые проблемы с потоком вэто случай кроме состояния гонки?Например, если обе функции будут пытаться изменить ресурс одновременно

1 Ответ

0 голосов
/ 26 мая 2018

Глобальные очереди отправки одновременные, , так что не защищает вашу функцию от одновременного вызова из нескольких потоков.

Если вы хотите сериализовать доступ к ресурсам, вам необходимосоздать serial очередь:

let myQueue = DispatchQueue(label: "myQueue", qos: .userInitiated)

Затем все рабочие элементы, отправленные в эту очередь, выполняются последовательно:

myQueue.async {
    changeSomeResources()
}

Обратите внимание, что UIApplication - какРесурс, связанный с пользовательским интерфейсом - должен быть доступен только в главном потоке:

DispatchQueue.main.async {
    // working with UIApplication.shared
}

Xcode также имеет параметры «Обеззараживатель потоков» и «Проверка основного потока» (на панели «Диагностика» настроек схемы), которые могутпомогите обнаружить проблемы с многопоточностью.

...