uv_async_t — Asyncハンドル

Asyncハンドルを使うと、別のスレッドからイベントループを「起こし」、コールバックを呼び出させることができます。

注記

uv_async_send()とuv_async_cbの呼び出しは、特定のAsyncハンドルについて逐次一貫性(seq_cst)を持つ操作です。uv_async_send()より前に行われたすべてのメモリアクセス(読み取りと書き込み)は、そのコールバックから可視になります。

警告

libuvはuv_async_send()の呼び出しをまとめます。つまり、呼び出すたびに必ずコールバックが実行されるわけではありません。たとえば、コールバックが呼び出される前にuv_async_send()を続けて5回呼び出しても、コールバックは1回しか呼び出されません。コールバックが呼び出された後でuv_async_send()を再び呼び出すと、コールバックも再び呼び出されます。ただし、逐次一貫性があるため、そのコールバックで読み書きする値は、もう一方のスレッドが読み書きした値と常に同じか、それより新しい値になります。

バージョン1.53.0で変更: uv_async_send()とuv_async_cbは逐次一貫性を持ちます。これより前のバージョンでは、libuvが呼び出しをまとめる可能性のある場合、正しい動作のために、その前に完全なseq_cstフェンスが必要になると考えられます。

データ型

type uv_async_t

Asyncハンドルの型。

typedef void (*uv_async_cb)(uv_async_t *handle)

uv_async_init()に渡すコールバックの型定義です。

公開メンバー

該当なし

関連項目

uv_handle_tのメンバーも適用されます。

API

int uv_async_init(uv_loop_t *loop, uv_async_t *async, uv_async_cb async_cb)

ハンドルを初期化します。コールバックにNULLを指定してもかまいません。

戻り値:

成功した場合は0、失敗した場合は0未満のエラーコード。

注記

他のハンドル初期化関数とは異なり、この関数はハンドルを直ちに開始します。

int uv_async_send(uv_async_t *async)

イベントループを起こし、Asyncハンドルのコールバックを呼び出します。

戻り値:

成功した場合は0、失敗した場合は0未満のエラーコード。

注記

この関数はどのスレッドから呼び出しても安全です。コールバックはイベントループのスレッドで呼び出されます。

注記

uv_async_send()は非同期シグナル安全です。シグナルハンドラーからこの関数を呼び出しても安全です。

注記

この関数は、同じAsyncハンドルを使う他の呼び出しやコールバックに対して、完全なメモリフェンスとして働きます。そのため、送信側スレッドと受信側スレッドにおいて、この呼び出しと対応するコールバックの前後にあるすべての操作の順序を定めます。

関連項目

uv_handle_tのAPI関数も適用されます。