0
私の理解では、単一の使用のためuv_async
の適切な使用は、以下のことです:単一使用のuv_asyncコールバックにuv_async_sendの代わりにuv_closeを使用しますか?
uv_async_t
ハンドルを割り当てます。- 割り当て済みハンドルの
uv_async_init
を呼び出します。 - コール
uv_async_send
をコールしてコールバックをスケジュールします。 uv_close
を使用してハンドルの登録を解除します。- 閉じるコールバックで
uv_async_t
ハンドルを削除します。たとえば、
:
uv_async_t *handle = (uv_async_t*)malloc(sizeof(uv_async_t));
uv_async_init(&uvLoop, handle, [](uv_async_t *handle) {
// My async callback here
uv_close((uv_handle_t*)handle, [](uv_handle_t* handle) {
free(handle);
});
});
uv_async_send(&asyncCb->uvAsync);
私が集まる何から、uv_close
はuvLoopで非同期と呼ばれています。したがって、私は、イベントループ内の2つのコールバックキューイングを避けるために次の操作を行うように誘惑しています:
uv_async_t *handle = (uv_async_t*)malloc(sizeof(uv_async_t));
uv_async_init(&uvLoop, handle, nullptr);
uv_close((uv_handle_t*)handle, [](uv_handle_t* handle) {
// My async callback here
free(handle);
});
をこれを行う他の誰であり、それは安全であると考えていますか?
ありがとう、これは私が必要とした答えです。 'uv_async_send'はスレッドセーフですが、' uv_close'はそうではないとは思いませんでした。 'uv_close'のコールバックに依存しているコードの2番目のバージョンは、スレッドセーフではなく、最初のバージョンのコードに代わるものではありません。私のテストでは、おそらく生産で爆発するのを待っている純粋な運から出てきていました。 – GaspardP