Aysnchronous I/O

NNG provides rich support for asynchronous I/O. This allows applications to achieve high levels of concurrency with a minimum of fuss, optimized for the platform.

Asynchronous I/O is performed without blocking calling application threads, so they may continue to perform other work.

AIO Handles

Applications create an nng_aio object with a function to call when the operation is done (along with a pointer to application private data), then submit the operation.

These nng_aio objects are created using the nng_aio_alloc(), and destroyed using nng_aio_free().

The nng_aio object itself is declared like this:

#include <nng/nng.h>

typedef struct nng_aio nng_aio;

Every asynchronous operation uses its own instance an nng_aio, and each nng_aio can only be used with a single operation at a time.

important

Attempting to submit an operation using an nng_aio that is already in use for another operation will crash the application. However, it is possible to submit another operation on the nng_aio from the callback associated with the same nng_aio.

When the operation is complete, whether successfully or otherwise, the callback function is executed. The callback will be executed exactly once.

Cancellation

The asynchronous I/O framework also supports cancellation of operations that are already in progress (see nng_aio_cancel()), as well setting a maximum timeout for them to complete within (see nng_aio_set_timeout()).

Waiting for Completion

It is also possible to initiate an asynchronous operation, and wait for it to complete nng_aio_wait().

important

Applications must never call nng_aio_wait() or nng_aio_stop() from a callback registered to an nng_aio object. Doing so can lead to a deadlock.

See Also

nng_aio_abort, nng_aio_alloc, nng_aio_cancel, nng_aio_count, nng_aio_free, nng_aio_get_input, nng_aio_get_msg, nng_aio_get_output, nng_aio_result, nng_aio_set_input, nng_aio_set_iov, nng_aio_set_msg, nng_aio_set_timeout, nng_aio_stop, nng_aio_wait