stringtranslate.com

Канал (программирование)

В вычислительной технике канал — это модель для межпроцессного взаимодействия и синхронизации посредством передачи сообщений . Сообщение может быть отправлено по каналу, а другой процесс или поток может получать сообщения, отправленные по каналу, на который у него есть ссылка , как поток . Различные реализации каналов могут быть буферизованными или нет, а также синхронными или асинхронными.

каналы libthread

Многопоточная библиотека libthread, впервые созданная для операционной системы Plan 9 , обеспечивает межпотоковое взаимодействие на основе каналов фиксированного размера.

События OCaml

Модуль событий OCaml предлагает типизированные каналы для синхронизации. Когда вызываются функции отправки и получения модуля, они создают соответствующие события отправки и получения, которые можно синхронизировать.

Примеры

Луа Лав2Д

Библиотека Love2D , использующая язык программирования Lua , реализует каналы с операциями push и pop, похожими на стеки. Операция pop будет блокироваться, пока в стеке есть данные. Операция demand эквивалентна pop, за исключением того, что она будет блокироваться, пока в стеке есть данные

-- Строка, содержащая код, который будет интерпретироваться функцией, например loadstring(), -- но на стороне C для запуска собственного потока.local  threadCode  =  [[  love.thread.getChannel("test"):push("Привет, мир!") ]]function  love.load () Начать поток.   thread  =  love.thread.newThread ( threadCode ) thread : start ( )   -- Поток будет заблокирован до тех пор, пока "Hello world!" не будет извлечен из стека теста канала.  -- Поскольку канал может быть извлечен до того, как поток впервые выполнится, в стеке может не быть данных.  -- В этом случае используйте :demand() вместо :pop(), поскольку :demand() будет заблокирован до тех пор, пока в стеке не появятся данные, а затем вернет данные.  печать ( любовь . поток . getChannel ( "тест" ): спрос ())  -- Теперь поток можно завершить. конец

XMOS XC

Язык программирования XMOS XC предоставляет примитивный тип «Chan» и два оператора «<:» и «:>» для отправки и получения данных из канала. [1]

В этом примере на XMOS запускаются два аппаратных потока, запускающих две строки в блоке "par". Первая строка передает число 42 по каналу, а вторая ждет его получения и устанавливает значение x. Язык XC также допускает асинхронный прием по каналам через оператор select.

чан с ; интервал х ; пар { с <: 42 ; с :> х ; }         

Идти

Этот фрагмент кода Go работает аналогично коду XC. Сначала создается канал c, затем порождается goroutine, которая отправляет 42 через канал. Когда число помещается в канал x, он устанавливается в 42. Go позволяет каналам буферизировать содержимое, а также неблокируемый прием с помощью блока select. [2]

c := make ( чан инт )   перейти функция () { c <- 42 }()    х := <- с   

Ржавчина

Rust предоставляет асинхронные каналы для связи между потоками. Каналы позволяют осуществлять однонаправленный поток информации между двумя конечными точками: и Sender. Receiver[ 3]

использовать std :: sync :: mpsc ; использовать std :: thread ;  fn  main () { let ( tx , rx ) = mpsc :: channel ();       поток :: spawn ( move || { tx . send ( 123 ). unwrap (); });     пусть результат = rx.recv (); println ! ( "{:?}" , результат ) ; }     

Приложения

В дополнение к их фундаментальному использованию для межпроцессного взаимодействия, каналы могут использоваться как примитив для реализации различных других параллельных программных конструкций, которые могут быть реализованы как потоки. Например, каналы могут использоваться для построения futures и promises , где future — это одноэлементный канал, а promise — это процесс, который отправляет в канал, выполняя future. [4] Аналогично, итераторы могут быть построены непосредственно из каналов. [5]

Список реализаций

Ссылки

  1. ^ "Руководство по программированию XMOS | XMOS". Архивировано из оригинала 2016-03-04 . Получено 2015-05-10 .
  2. ^ «Эффективный Go — язык программирования Go».
  3. ^ "Каналы - Rust на примере". doc.rust-lang.org . Получено 28 ноября 2020 г. .
  4. ^ "Фьючерсы, архив 2020-12-04 на Wayback Machine ", Шаблоны языка Go, архив 2020-11-11 на Wayback Machine
  5. ^ "Итераторы, архив 2020-10-15 на Wayback Machine ", Шаблоны языка Go, архив 2020-11-11 на Wayback Machine
  6. ^ Суфрин, Бернард (2021-07-13), ThreadCSO (PDF) , получено 2023-02-17
  7. ^ Суфрин, Бернард (2021-07-13), ThreadCSO , получено 2023-02-17
  8. ^ "stlab — это продолжающаяся работа лаборатории программных технологий Adobe. Исходные библиотеки Adobe (ASL), библиотеки платформ и новые библиотеки stlab размещены на github". 2021-01-31.

Внешние ссылки