Я работаю над приложением iOS, где потенциально SDK может отправлять уведомления приложению одновременно во многих различных потоках и пытаться записать некоторые элементы в цепочку для ключей. Прежде чем добавить элемент в цепочку для ключей, мой код (очевидно) проверяет, присутствует ли элемент в цепочке для ключей, и если да, то он генерирует исключение errSecDuplicateItem
дублирующийся элемент.
Не поздно, я заметил сбои относящийся к исключению дублирующегося элемента, в то время как некоторый процесс пытается добавить / записать значение в цепочку для ключей.
Теперь мой вопрос, AFAIK, API цепочки для ключей являются поточно-ориентированными и реентерабельными по своей природе.
https://developer.apple.com/documentation/security/certificate_key_and_trust_services/working_with_concurrency
Однако, поскольку исключение в моем случае выбрасывается errSecDuplicateItem
, это определенно похоже на проблему syn c потока. Возможно, даже если сами API цепочки для ключей являются поточно-ориентированными, поток использования (вещи, происходящие в разных потоках и т. Д. c.) В моем случае может вызвать проблему syn c. На данный момент я решил, что было бы неплохо рассматривать добавление элемента в цепочку для ключей как критическую секцию (поэтому у меня есть только весь код внутри @synchronized(self) {}
) и посмотреть, сможем ли мы снова воспроизвести ошибку.
Я на правильном пути?