Чем новая асинхронная модель в C++26 отличается от существующих моделей?

Я читал части https://eel.is/c++draft/exec и другие статьи по этой теме. Я знаю, что такое планировщики, получатели и отправители. Однако я не понимаю, как эти взаимодействия создают такую ​​новую модель асинхронного программирования на C++.

Мне интересно, чем они отличаются от других моделей, таких как примитивные std::future и std::promise, исполнители и ASIO Boost?

напоминает мне библиотеки моделирования прошлого, которые использовались для имитации Verilog на C++.

Gene 03.08.2024 19:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
138
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Мне интересно, чем они отличаются от других моделей, таких как примитивные std::future и std::promise, исполнители и ASIO Boost?

Не уверен, что вы подразумеваете под «исполнителями», если не то самое предложение, на которое вы ссылаетесь, и я не знаю о Boost ASIO, но что касается того, как P2300 (предложение, лежащее в основе той части проекта, на которую вы ссылаетесь) относится к std::future и std::promise, разница именно в том, что эти два являются строительными блоками очень низкого уровня того, что Эрик Ниблер называет «неструктурированным параллелизмом». С этими строительными блоками на вас, как на программиста, ложится большая ответственность с точки зрения управления жизненным циклом (скажем, состояний, обратных вызовов и т. д.).

P2300 является основой структурированного параллелизма, целью которого является предоставление строительных блоков, освобождающих вас от (части?) этих обязанностей. Чтобы внести ясность, Эрик Ниблер проводит аналогию между

  • неструктурированное программирование (только goto для потока управления) и структурированное программирование (с for/while/if для потока управления),
  • неструктурированный параллелизм (std::future, std::promise, std::mutex, ...) и структурированный параллелизм (when_all, when_any и другие абстракции, предложенные в P2300, плюс сопрограммы).

Однако это очень обширная тема, и я, честно говоря, не могу подробно ответить на вопросы (если бы я мог, я бы, вероятно, больше беспокоился о том, как я могу потратить свои 500 тысяч фунтов стерлингов в год, чем о том, как проводить время здесь). но я думаю, что вы можете найти большую часть ответа на свой вопрос в этих трех выступлениях (и по ссылкам выше):

Эрик Ниблер (и в первом видео Дейзи Холлман) достаточно раскроют эту тему. Однако слишком много, чтобы дать здесь ответ. Плюс не то чтобы я понял все до мелочей :D

Эрик объяснил это в этом выступлении https://thewikihow.com/video_h-ExnuD6jms?t=525

По сути, std::experimental::future::then медленный и сломанный.

std::promise/std::future выделяет, и вам нужно выполнить подсчет ссылок для этого распределения.

Между std::promise::set_value существует состояние гонки и future::then. Чтобы избежать состояния гонки, вам нужны std::mutex и std::condition_variable.

Во время создания future/promise вы не знаете тип продолжения/вызываемого объекта. Это должен быть стертый тип, т. е. std::function, который имеет другое распределение и, возможно, косвенность через указатель на функцию. Итак, одно или два выделения, косвенный вызов функции, блокировка, подсчет ссылок. Это действительно тяжелый вес.

Отправители и получатели делают все это во время компиляции, что позволяет избежать блокировок и выделения ресурсов.

Другие вопросы по теме