2017-05-03 13 views
0

によって呼び出されることを確認しますasynchonousコールバックが<a href="http://docs.libuv.org/en/v1.x/async.html?highlight=uv_async_send" rel="nofollow noreferrer">documentation of libuv states</a> libuv

libuvはつまり、それまでではないすべての呼び出し は、コールバックの実行をもたらすだろう、()をuv_async_sendの呼び出しを合体します。たとえば、 uv_async_send()が呼び出される前に行が5回呼び出された場合、 が呼び出されると、コールバックは1回だけ呼び出されます。 uv_async_send()がコールバックが呼び出された後に再び が呼び出されると、それは再び呼び出されます。

だから場合には、私はuv_async_send()に電話をかけるたびに、私のコールバックが正しいペイロードと呼ばれ、それが明確なuv_async_tハンドルを有していれば取得します保証を必要としますか?たとえば、新しいuv_async_tをヒープに割り当て、そのdataのメンバーを記入して、uv_async_inituv_async_sendとコールし、処理コールバックでuv_closeを使用してハンドルを閉じてから削除しますか?どのスレッドがuv_async_tを構成し、どのスレッドがuv_async_initを呼び出すかは重要ですか?

EDIT

  1. this discussionによればスレッドがuv_async_initを呼び出し問題はありません。
  2. answer to a previous questionによると、uv_closeに渡されたクローズコールバックが呼び出された後でのみ、uv_async_tを削除するように注意する必要があります。

答えて

1

これは、スレッドセーフなキューと1つの非同期ハンドルを使用して実行できます。呼び出されるコールバックが必要なときは、それを保持する構造体を作成し、キューに入れてuv_async_sendをコールし、コールバックプロセスで空になるまで待ちます。

+0

もっと簡単な解決策を望んでいましたが、正しく理解すれば 'uv_async_init'をループの開始前に呼び出す必要がありますか? – sigy

+1

必ずしもそうではありませんが、ループスレッドで呼び出す必要があります。 – saghul

関連する問題