Нужна ли синхронизация блоку xpc_connection_set_event_handler, чтобы избежать состояния гонки?

#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, я приложил пример кода