Кто как реализует асинхронные вызовы? Типичным назначением асинхронного вызова это вызов колбек функции. Если такая функция по пробует получить доступ к данным. То состояние этих данных должно быть определено.
Как это решается при параллельном программировании? Решается это при помощи механизмов синхронизации по данным: мьютексы и запоры(Lock).
Отсюда вывод параллельное выполнение привело бы к тому, что все данные надо будет оборачивать в защитные механизмы и программирование в общем случае усложняется. Так разумеется никто не делает. В место этого используется корпоративная многозадачность. Как это сделано в POSIX? Практически все системные вызовы перед тем как начать работать по своему алгоритму проверяют нет ли асинхронных сигналов и если есть выполняют их и вываливаются с ошибкой EINTR. А если нет, то выполняют свой алгоритм. Как это сделано в Windows? Передача в асинхронные вызовы идёт только при проверке очереди сообщений и ожиданий событий. Для стандартного ввода/вывода предусмотрены какие-то слабо документированные пути, которые решают частные проблемы. Суть в том что в STD для Cx11 по попросту создаёт параллельный поток в котором и проверяется очередь сообщений. От чего уходили к тому и вернулись. Понимаете что процессы синхронизации там сделаны через одно место.
Зачем нужны асинхронные вызовы? К примеру что-бы прервать долгие функцииалгоритмы такие как чтение большого файла или потока. Послать сигнал завершения работы, для корректной остановки приложения. Таймер, который желательно иметь с гарантированными интервалами во времени. Ещё для оптимизации механизмов синхронизаций по событиям и времени(wait* - функции). С другой стороны больше я и не знаю для чего. Есть ли другие области которые я забыл?
Ещё FlowControl. Некоторые его разновидности управляют синхронизацией передачи данных через дополнительные сигнальные линии. Я сейчас говорю не только про RS232. Но и про именованные каналы, консольный ввод/вывод, потоки, файлы, сокеты.
Это было предисловие. Теперь вопрос, а как бы вы реализовали всю эту машинерию? Как по мне что в POSIX что в WinAPI это сделано крайне неудобно.
|