Я работаю над библиотекой, которая реализует модель актера поверх Grand Central Dispatch (в частности, libdispatch API уровня C). В основном, краткий обзор моей системы таков:
- Общение происходит между актерами, использующими сообщения
- Только многоадресная связь (один актер для многих актеров)
- Отправители и получатели отделены друг от друга с помощью доски, куда отправляются сообщения.
- Сообщения отправляются в очередь по умолчанию асинхронно с использованием dispatch_group_async (), как только сообщение помещается на доске.
Я сейчас пытаюсь реализовать фьючерс на языке, поэтому я создал новый тип, который содержит некоторую информацию:
- Собственная группа
- Возвращаемое значение
Однако у меня есть проблема, поскольку dispatch_block_t имеет тип void (^) (void), поэтому он ничего не возвращает. Так что моя идея в моей функции future_new () о создании другой группы, которая может быть использована для выполнения блока, возвращающего результат, который я могу сохранить в своем члене «value» в моей структуре future_t, не будет работать. 1021 *
Остальная часть реализации фьючерсов очень ясна, за исключением того, что все зависит от способности вернуть значение в будущее от актера, действующего на основании сообщения.
При использовании библиотеки это значительно уменьшило бы ее полезность, если бы мне пришлось просить пользователей (и меня) знать, когда фьючерсы будут использоваться другими частями системы - это просто не практично.
Мне интересно, может ли кто-нибудь придумать способ обойти это?