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関数も適用されます。