Асинхронные API - PullRequest
       100

Асинхронные API

2 голосов
/ 15 сентября 2008

Когда я пытаюсь реализовать асинхронные вызовы API / неблокирующие вызовы, я немного знаю, что у меня есть в приложении All Plain-C, я читал об APM (модель асинхронного программирования) от «Делегатов». По сути, я хочу вызвать один API f1() для выполнения функции (которая занимает 8-10 секунд), поэтому я называю этот API f1(), забуду об этом и продолжу выполнять какую-то другую работу, например, Ввод / вывод для извлечения данных для следующего вызова f1() или некоторых функций, не зависящих от результата f1().

Если кто-то использовал эту модель программирования APM, я смотрю на краткое объяснение реализации неблокирующих вызовов.

Есть ли другой способ реализации асинхронных API, любая другая библиотека / фреймворк, которая может помочь в этом?

Ответы [ 5 ]

1 голос
/ 30 сентября 2008

Если функция f1 (), на которую вы ссылаетесь, сама по себе не реализована в асинхронном режиме, вам нужно будет обернуть ее в свой собственный поток самостоятельно. Делая это, вы должны быть осторожны в отношении побочных эффектов, которые могут быть вызваны той конкретной вызываемой функцией. Многие библиотеки не спроектированы как потокобезопасный, и многократный одновременный вызов функций из таких библиотек приведет к повреждению данных. В таких случаях вам может понадобиться обернуть функциональность во внешний рабочий процесс. Для тяжелой работы, которую вы упомянули (8-10 секунд), эти накладные расходы могут быть приемлемыми. Если вы будете одновременно использовать только внешние не-безопасные функции в одном потоке, вы можете быть в безопасности.

Проблема с использованием любой формы цикла обработки событий заключается в том, что внешняя функция, которая не знает о вашем цикле, никогда не вернет управление вашему циклу. Таким образом, вы не сможете больше ничего делать.

1 голос
/ 15 сентября 2008

В основном вам необходимо создать многопоточное (или многопроцессорное) приложение. API f1 () должен порождать поток (или процесс) для обработки данных в отдельном пространстве выполнения. По завершении подпрограмма f1 () должна сообщить основному процессу, что выполнение выполнено (signal (), очереди сообщений и т. Д.).

1 голос
/ 15 сентября 2008

Популярным способом выполнения асинхронного программирования в простых программах на C является использование "цикла обработки событий". Есть множество библиотек, которые вы можете использовать. Я предлагаю взглянуть на бойкий .

Другой альтернативой является использование нескольких приоритетных потоков (по одному для каждой параллельной операции) и синхронизация их с мьютексами и условными переменными. Однако я бы избегал упреждающих потоков в простом C, особенно если вы хотите писать переносимые программы. Трудно понять, какие библиотечные функции являются реентерабельными, обработка сигналов в многопоточных программах доставляет неудобства, и в целом библиотеки C и системные функции были разработаны для однопоточного использования.

Если вы планируете запускать ваше приложение только на одной платформе (например, Windows), и работа, выполняемая с помощью f1 (), является относительно простой задачей, тогда многопоточность может быть в порядке.

0 голосов
/ 19 апреля 2009

Хорошо. В основном я видел 2 типа асинхронного API:

  1. Прерывание. Вы даете обратный вызов, который должен быть выполнен после вызова. GIO (часть ранее упомянутой GLib) работает таким образом. Программировать его относительно легко, но обычно у вас есть измененный поток, в котором будет выполняться обратный вызов (за исключением случаев, когда он интегрирован с основным циклом, как в случае с GIO).
  2. Опрос. Вы проверяете, доступны ли данные. Известные разъемы BSD работают таким образом. Его преимущество заключается в том, что он не обязательно интегрируется в основной цикл и выполняет обратный вызов в определенном потоке.

Если вы программируете для Gnome или Gtk +, я бы хотел добавить, что GTask кажется очень хорошим (потенциально хорошим? Я не использовал его). Vala будет лучше поддерживать асинхронные вызовы, подобные GIO.

0 голосов
/ 15 сентября 2008

Замените делегатов указателями на функции в C, все остальное в основном то же, что вы прочитали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...