#objective-c #swift #macos #xpc
#objective-c #swift #macos #xpc
Вопрос:
Я запустил тестовый код с помощью ThreadSanitizer, он выдает условие гонки в блоке xpc_connection_set_event_handler, даже если я установил очередь синхронизации для соединения.
xpc_connection_set_event_handler(conn, ^(xpc_object_t event) {
xpc_type_t type = xpc_get_type(event);
if (xpc_get_type(event) == XPC_TYPE_DICTIONARY) {
// race condition here
// WARNING: ThreadSanitizer: data race
// ...
} else {
if (event == XPC_ERROR_CONNECTION_INVALID) {
// Error indicates the peer has closed the connection.
// Tear down any associated data structures.
} else {
// Error indicates that service will terminate soon.
// Flush all buffers, finish all work, etc.
}
xpc_release(peer);
}
});
https://developer.apple.com/documentation/xpc/1448786-xpc_connection_set_target_queue ?язык =objc:
«среда выполнения XPC гарантирует, что, когда целевая очередь является последовательной очередью, блок обработчика событий будет выполняться синхронно по отношению к другим блокам, отправленным в ту же очередь. очередь. Когда целевая очередь является параллельной очередью, блок обработчика событий может выполняться одновременно с другими блоками, отправленными в эту очередь, но он никогда не будет выполняться одновременно с другими вызовами самого себя для того же соединения »
похоже, что в соответствии с приведенным выше описанием не должно быть состояния гонки, но почему я сталкиваюсь с проблемой состояния гонки, о которой сообщает ThreadSanitizer?
Нужна ли синхронизация блоку xpc_connection_set_event_handler, чтобы избежать состояния гонки?
Комментарии:
1. Что вы подразумеваете под «я запустил код с помощью ThreadSanitizer, он выдает условие гонки в блоке xpc_connection_set_event_handler, даже если я использую очередь синхронизации»? Это грамматически неправильное английское предложение.
2. @ElTomato, я приложил пример кода