Гарантируется ли, что передача сообщений по каналам в go будет неблокирующей?

Чтобы оценить, является ли go возможным вариантом для аудио / видео приложения, я хотел бы знать, удовлетворяет ли передача сообщения go каким-либо неблокирующие гарантии прогресса (отсутствие препятствий, блокировка или ожидание). В частности, актуальны следующие сценарии:

Один производитель, один потребитель:

Два потока обмениваются данными, используя общий канал. Поток A выполняет только асинхронную отправку,поток B выполняет только асинхронный прием. Предположим, что планировщик ОС решает прервать поток A в «наихудший момент» на неопределенное время. Гарантированно ли поток B завершит операцию приема за ограниченное количество циклов процессора или существует (теоретическая) возможность, что поток A может перевести канал в состояние, при котором потоку B нужно ждать, пока ОС возобновит выполнение потока A?

Несколько производителей:

Несколько потоков A1, A2, A3, ... обмениваются данными с одним или несколькими другими потоками, используя общий канал. Потоки Ai выполняют только асинхронную отправку. Предположим, A2, A3, ... приостановлены планировщиком ОС в «наихудший момент» на неопределенное время. Гарантируется ли, что поток A1 завершит операцию отправки за ограниченное количество циклов процессора? Предположим далее, что каждый поток хочет сделать только одну отправку. Если программа выполняется достаточно долго (со «злонамеренным» планировщиком, который потенциально лишает некоторые потоки или прерывает и возобновляет потоки в «наихудший из возможных моментов»), гарантированно ли будет выполнена хотя бы одна отправка?

Я не так уж много Здесь интересны типовые сценарии, а скорее гарантии наихудшего случая. См. Неблокирующий алгоритм (Википедия) для получения более подробной информации об алгоритмах блокировки, блокировки и ожидания.

8
задан skaffman 18 July 2011 в 17:05
поделиться