blob: d67a15a6307d4fad4203fa675856e11b8805eba9 [file] [log] [blame]
.. _module-pw_async2:
=========
pw_async2
=========
.. pigweed-module::
:name: pw_async2
- **Simple Ownership**: Say goodbye to that jumble of callbacks and shared
state! Complex tasks with many concurrent elements can be expressed by
simply combining smaller tasks.
- **Efficient**: No dynamic memory allocation required.
- **Pluggable**: Your existing event loop, work queue, or task scheduler
can run the ``Dispatcher`` without any extra threads.
- **Coroutine-capable**: C++20 coroutines work just like other tasks, and can
easily plug into an existing ``pw_async2`` system.
:cpp:class:`pw::async2::Task` is Pigweed's async primitive. ``Task`` objects
are cooperatively-scheduled "threads" which yield to the
:cpp:class:`pw::async2::Dispatcher` when waiting. When the ``Task`` is able to make
progress, the ``Dispatcher`` will run it again. For example:
.. tab-set::
.. tab-item:: Manual state machine
.. literalinclude:: examples/basic.cc
:language: cpp
:linenos:
:start-after: [pw_async2-examples-basic-manual]
:end-before: [pw_async2-examples-basic-manual]
.. tab-item:: Coroutine
.. literalinclude:: examples/basic.cc
:language: cpp
:linenos:
:start-after: [pw_async2-examples-basic-coro]
:end-before: [pw_async2-examples-basic-coro]
Tasks can then be run on a :cpp:class:`pw::async2::Dispatcher` using the
:cpp:func:`pw::async2::Dispatcher::Post` method:
.. literalinclude:: examples/basic.cc
:language: cpp
:linenos:
:start-after: [pw_async2-examples-basic-dispatcher]
:end-before: [pw_async2-examples-basic-dispatcher]
.. grid:: 2
.. grid-item-card:: :octicon:`rocket` Quickstart & guides
:link: module-pw_async2-quickstart-guides
:link-type: ref
:class-item: sales-pitch-cta-primary
How to:
* Use dispatchers to coordinate tasks
* Pass data between tasks
* Use coroutines
And more.
.. grid-item-card:: :octicon:`code-square` Reference
:link: module-pw_async2-reference
:link-type: ref
:class-item: sales-pitch-cta-secondary
API reference for:
* ``Task``
* ``Dispatcher``
* ``CoRo``
And more.
.. grid:: 2
.. grid-item-card:: :octicon:`code-square` Backends
:link: module-pw_async2-backends
:link-type: ref
:class-item: sales-pitch-cta-secondary
You can fulfill the ``pw_async2`` interface with a Pigweed-provided
backend or roll your own.
.. grid-item-card:: :octicon:`pencil` Pigweed blog: C++20 coroutines
:link: docs-blog-05-coroutines
:link-type: ref
:class-item: sales-pitch-cta-secondary
A blog post on how Pigweed implements coroutines without heap
allocation, and challenges encountered along the way.
.. toctree::
:hidden:
:maxdepth: 1
guides
reference
Backends <backends>