5

イベントが私の制御下にない他のスレッドによってトリガーされるため、js関数をコールバックすることになっているノードC ++アドオンを作成しています(実際には、私が使用するマネージドdllの.netスレッドです)。JS の世界はシングルスレッドであるため、js 関数の参照を保持したまま、非 js スレッドから呼び出すことはできません。そのスレッドのコールバック関数に渡したいパラメータを作成することさえできません。

uv_queue_workjs スレッドから作業を移動し、終了したら js スレッドからコールバックして、js 関数をコールバックするなど、必要なことを行う場合に使用されているのを見てきました。

後で参照するために、その関数のシグネチャを次に示します。

int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb,
uv_after_work_cb after_work_cb);

uv_queue_work を呼び出すことは、1 回限りのジョブでは問題ありません。また、 from への呼び出しを連鎖させることで、任意の頻度で私を呼び出すようにすることもできますが、uv_queue_work他のスレッドと同期しますが、もっと簡単な方法はないのでしょうか。after_work_cbwork_cb

次の機会にメインの js スレッドで実行されるコードを指す fn ポインターを使用して、他のスレッドから直接呼び出すことができる node.js によって提供される fn のように。何か案が?

4

1 に答える 1

7

uv_queue_work を使用するのではなく、uv_async_* 関数を調べる必要があります ( https://github.com/joyent/libuv/blob/master/include/uv.hを確認してください)。

これの非常に優れた実装は、ノード sqllite プロジェクトhttps://github.com/developmentsseed/node-sqlite3/blob/master/src/async.hにあります。

ただし、このことに非常に注意しないと、いくつかのひどいループ参照カウントのバグが発生することになります (アプリケーションが早期に終了するか、まったく終了しません)

于 2012-07-09T08:41:28.537 に答える