Каково различие между асинхронными и неблокирующимися вызовами? Также между блокированием и синхронными вызовами (с примерами)?
Во многих случаях это разные названия одного и того же предмета, но в некоторых контекстах они совершенно разные. Так что это зависит от обстоятельств. Терминология не применяется единообразно во всей индустрии программного обеспечения.
Например, в API классических сокетов неблокирующий сокет - это тот, который просто немедленно возвращается со специальным сообщением об ошибке «Будет блокировать», тогда как блокирующий сокет будет заблокирован. Вы должны использовать отдельную функцию, например select
или poll
, чтобы узнать, когда лучше всего повторить попытку.
Но асинхронные сокеты (поддерживаемые сокетами Windows) или шаблон асинхронного ввода-вывода, используемый в .NET, более удобны. Вы вызываете метод, чтобы начать операцию, и фреймворк перезвонит вам, когда это будет сделано. Даже здесь есть принципиальные отличия. Асинхронные сокеты Win32 «маршалируют» свои результаты в конкретный поток графического интерфейса, передавая сообщения Window, тогда как асинхронный ввод-вывод .NET является свободным потоком (вы не знаете, в каком потоке будет вызван ваш обратный вызов).
Значит, они не всегда означают одно и то же. Чтобы выделить пример сокета, мы могли бы сказать:
Как вы, вероятно, можете видеть из множества различных (и часто взаимоисключающих) ответов, это зависит от того, кого вы спрашиваете. В некоторых случаях эти термины являются синонимами. Или каждый из них может относиться к двум схожим концепциям:
В любом случае цель состоит в том, чтобы позволить программе не блокироваться в ожидании завершения медленного процесса - единственное реальное различие - это то, как программа, как ожидается, отреагирует. Какой термин относится к тому, что также меняется от программиста к программисту, от языка к языку или от платформы к платформе. Или термины могут относиться к совершенно другим концепциям (например, к использованию синхронного / асинхронного по отношению к программированию потоков).
Извините, но я не верю, что существует единственный правильный ответ, который был бы верен в глобальном масштабе.
Они различаются только написанием. Нет разницы в том, к чему они относятся. Говоря техническим языком, можно сказать, что они различаются по акцентам. Неблокирование относится к потоку управления (не блокируется). Асинхронным называется, когда событие \ данные обрабатываются (не синхронно).
Неблокировка: эта функция не будет ждать в стеке.
Асинхронный: работа может продолжаться от имени вызова функции после того, как этот вызов покинет стек