2012-07-09 2 views
5

이벤트가 내 제어하에 있지 않은 다른 스레드에 의해 트리거 될 때 js 함수를 다시 호출해야하는 노드 C++ 애드온을 만듭니다 (실제로는 .net 스레드를 사용하는 관리되는 DLL에서. JS 세계는 단일 스레드이므로 js 함수 참조를 유지하고 해당 비 js 스레드에서 호출 할 수는 없습니다. 내가 그 스레드에서 해당 콜백 함수에 전달하려는 매개 변수를 만들 수 없습니다.Node.js C++ addon : 다른 스레드의 다중 콜백

js 스레드에서 작업을 옮기고 끝내고 js 스레드에서 다시 호출하여 예를 들어 수행해야 할 작업을 수행하려는 경우에 uv_queue_work이 사용되는 것을 보았습니다. 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를 호출하면 일회성 작업에 괜찮습니다, 나는 아마 after_work_cb에서 uv_queue_work에 전화를 체인 임의로 종종 나에게 전화를 얻을 수 : 나중에 참고로

, 여기에 그 함수의 서명입니다 work_cb은 다른 스레드와 동기화되지만보다 직접적인 방법이 없는지 궁금합니다.

node.js에서 제공하는 fn과 유사하며 다음 번에 주 js 스레드에서 실행될 코드를 가리키는 fn 포인터로 다른 스레드에서 직접 호출 할 수 있습니다. 어떤 생각?

답변

7

uv_queue_work를 사용하는 대신 uv_async_ * 함수 (Check out https://github.com/joyent/libuv/blob/master/include/uv.h)를 확인해야합니다.

아주 멋진 구현은 sqllite 노드 https://github.com/developmentseed/node-sqlite3/blob/master/src/async.h에 있습니다. 그러나 그냥 메모

,이 물건 극단적으로주의하지 않으면, 당신은 몇 가지 그 끔찍한 루프 참조 카운트 버그 (응용 프로그램에 일찍, 또는 전혀 종료)

+0

스폿으로 끝날 것 에! 정확히 내가 필요로하는 것. –