Что сопрограммы в [тег:с++20]?
В чем она отличается от "Parallelism2" или/и "Concurrency2 и" (смотри на изображении)?
Ниже изображение с ISOCPP.
На абстрактном уровне, сопрограммы разделить идею государства исполнения от идеи наличия потока выполнения.
Технология SIMD (одна инструкция, множество данных) имеет несколько "и потоки выполнения" но только в одном исполнении государственного (она просто работает на нескольких данных). Возможно, параллельные алгоритмы немного такой, в том, что у вас есть одно "по программе" работать на разных данных.
Резьбонарезные имеет несколько "и потоки выполнения" и выполнении нескольких государств. У вас есть более чем одной программы и более чем один поток выполнения.
Сопрограммы имеет несколько состояний выполнения, но не имеет потока исполнения. У вас есть программа, и программа государственная, но это не имеет потока исполнения.
Самый простой пример сопрограммы являются генераторами или enumerables из других языков.
В псевдо-код:
function Generator() {
for (i = 0 to 100)
produce i
}
В генератор
называется, и впервые его называют он возвращает 0
. Его состояние запоминается (сколько государство зависит от реализации сопрограмм), и в следующий раз, когда вы называете его по-прежнему, где она была прервана. Так он возвращает 1 в следующий раз. Затем 2.
Наконец, он достигает конца цикла и падает в конце функции; сопрограмма закончена. (То, что происходит здесь, зависит от языка, о котором мы говорим; в Python, это бросает исключение).
Сопрограммы вывести эту функцию на C++.
Существует два вида сопрограммы; stackful и stackless.
В stackless сопрограмма только магазины локальных переменных в свое состояние и его место исполнения.
В stackful сопрограмма хранит весь стек (как нить).
Stackless сопрограммы могут быть чрезвычайно легкий вес. Последнее предложение я прочитал участвует в основном рерайтинг ваша функция в чем-то немного похоже на лямбду; все локальные переменные перейдет в состояние объекта и метки используются для перехода к/от места сопрограмма на "производит" и промежуточные результаты.
Процесс получения значения название "Выход", как сопрограммы немного как кооперативная многопоточность; вы не поддавшись на момент выполнения обратно.
Импульс имеет реализация stackful сопрограммы; он позволяет вызвать функцию, чтобы произвести для вас. Stackful сопрограммы являются более мощными, но и более дорогие.
Есть еще сопрограммы, чем простой генератор. Вы можете подождать в сопрограмма сопрограмма, которая позволяет создавать сопрограммы в полезной манере.
Сопрограммы, как если, циклы и вызовы функций, являются еще одной разновидностью "и структурированное Гото", что позволяет выразить некоторые полезные модели (такие как конечные автоматы) в более естественным образом.
Конкретная реализация сопрограмм в C++ - это немного интересно.
На самом базовом уровне, это добавляет несколько ключевых слов в C++: co_return
co_await
co_yield
, вместе с какой-то библиотеки типов, которые работают с ними.
Функция становится сопрограмма, имея одним из тех, кто в своем теле. Так что от их заявления, что они ничем не отличаются от функций.
Когда один из эти три слова используются в теле функции, некоторые стандартные поручено рассмотрение возвращаемый тип и аргументы не происходит и функция превращается в сопрограммы. Это изучение указывает компилятору, где хранить государственную функцию, когда функция приостанавливается.
Самый простой сопрограмма-генератор:
generator<int> get_integers( int start=0, int step=1 ) {
for (int current=start; true; current+= step)
co_yield current;
}
co_yield
приостанавливает выполнение функций, магазинах, что государство в генератор и Л;int> У, то возвращает значение
текущийс помощью
генератора и Л;int>`.
Вы можете перебрать все целые вернулись.
co_await
в то же время позволяет соединить одной сопрограммы к другой. Если вы находитесь в одной сопрограммы и вам нужны результаты ожидать вещь (часто сопрограмма) перед переходом, ты co_await на нем. Если они будут готовы, ты сразу переходим; если нет, то приостановить, пока ожидать вас ждем готово.
std::future<std::expected<std::string>> load_data( std::string resource )
{
auto handle = co_await open_resouce(resource);
while( auto line = co_await read_line(handle)) {
if (std::optional<std::string> r = parse_data_from_line( line ))
co_return *r;
}
co_return std::unexpected( resource_lacks_data(resource) );
}
load_data
- это сопрограмма, которая создает СТД::будущее
, когда открыл названный ресурс и нам удается разобрать до точки, где мы нашли запрошенные данные.
open_resource
и read_line, наверное, асинхронные сопрограммы, что открыть файл и прочесть строки из него. В
co_awaitсвязывает приостановление и состояние готовности
load_data на их прогресс.
В C++ сопрограммы являются гораздо более гибким, чем это, как они были реализованы как минимальный набор возможностей языка на верхней части пользовательского пространства видах. В пользовательском пространстве видах эффективно определить, что co_return
co_await
и co_yield
имею в виду - Я'вэ видел, как люди используют его для реализации монад необязательно такие выражения, что co_await на пустое дополнительное автоматически propogates в пустое состояние, внешний дополнительно:
modified_optional<int> add( modified_optional<int> a, modified_optional<int> b ) {
return (co_await a) + (co_await b);
}
вместо
std::optional<int> add( std::optional<int> a, std::optional<int> b ) {
if (!a) return std::nullopt;
if (!b) return std::nullopt;
return *a + *b;
}
Сопрограмма-это как функция C, которая имеет несколько операторов return и когда позвонил 2-ой раз не запускается выполнения в начале функции, но в первой инструкции после предыдущей выполняется возврат. Этот место выполнения сохраняется вместе с всех автоматических переменных, которые будут жить на стеке в функции сопрограмма.
Предыдущей экспериментальной реализации сопрограмм от Microsoft используют скопирован стеки, так что вы могли бы даже вернуться из глубоко вложенных функций. Но эта версия была отвергнута комитетом по c++. Вы можете сделать это осуществление, например, повышает библиотеки волокна.
сопрограммы должны быть (в C++) функции, которые имеют возможность, чтобы "ждать" и для некоторых других рутинных заполнить и предоставить все, что необходимо для подвесных, помолчал, ожидая, по заведенному порядку, чтобы идти дальше. функцию, наиболее интересные для C++ есть люди, которые сопрограммы в идеале бы нет места в стеке...C# еще можете сделать нечто подобное ждет и выход, но c++ могут быть перестроены, чтобы сделать это.
параллелизм в значительной степени сосредоточена на разделение проблем, если проблема-это задача, программа должна завершить. это разделение может быть достигнуто с помощью ряда средств...обычно делегация какая-то. идея параллелизма заключается в том, что несколько процессов могут работать независимо друг от друга (разделение) и 'слушатель' будет прямой, что получилось в те отделенные проблем туда, куда он должен идти. это сильно зависит от какой-то асинхронное управление. Существует ряд подходов к параллелизму, включая аспектно-ориентированного программирования и другие. В C# и#39;делегировать' оператор, который работает довольно хорошо.
параллельность похоже, параллелизма и могут быть вовлечены, но это физическая конструкция многих процессоров, расположенных в более или менее параллельно с программным обеспечением, которое в состоянии направить фрагменты кода для различных процессоров, где он будет работать, и результаты будут получены синхронно.