2015-11-15 5 views
3

У меня есть C++ lib, клиентское приложение использует эту библиотеку для запроса данных с сервера. Этот lib создает отдельный поток для связи с сервером, результат запроса будет передан как параметр в функции обратного вызова.libuv thread communication

Теперь я хочу обернуть этот C++ lib в собственный модуль nodejs, поскольку в этом потоке вызываются функции обратного вызова, чтобы передать результат запроса в среду js, я считаю, что мне нужно использовать uv_async_send libuv uv_async_t * async) для передачи данных между двумя нити (поправьте меня, если я ошибаюсь)

Согласно libuv's doc:.

Внимание: libuv сольются вызовы uv_async_send(), то есть не каждый вызов это приведет к выполнению обратного вызова. Например: если uv_async_send() вызывается 5 раз подряд перед вызовом обратного вызова, обратный вызов будет вызываться только один раз. Если uv_async_send() вызывается снова после вызова обратного вызова, он будет вызываться снова.

Означает ли это предупреждение, что uv_async_send может привести к потере данных? Я хочу знать, предлагает ли libuv лучшее решение для этой проблемы или я должен использовать некоторые другие библиотеки thead.

ответ

4

Вы правы - uv_async_send - это правильный способ разбудить главную нить. Я рекомендую, чтобы каждый раз, когда вы вызывали uv_async_send, вы накапливали связанные данные для обратного вызова в очереди или векторе или в каком-либо другом контейнере. Как упоминается в документации, вызовы uv_async_send() будут объединены, и событие обратного вызова разбудит основной поток хотя бы один раз. Чтобы обеспечить доставку всех ваших данных обратного вызова, вы захотите сохранить их где-нибудь в очереди или векторе, чтобы ваш код обратного вызова C++ мог доставить все это.

+0

Ваше предложение верное, спасибо за вашу помощь! – forrest

0

Вы также можете использовать uv_callback.

Он обрабатывает несвязанные вызовы с использованием очередей.

В потоке приемника:

uv_callback_t send_data; 

void * on_data(uv_callback_t *handle, void *data) { 
    do_something(data); 
    free(data); 
} 

uv_callback_init(loop, &send_data, on_data, UV_DEFAULT); 

В потоке отправителя:

uv_callback_fire(&send_data, data, NULL); 

Мы можем даже вызывать функции на другие потоки и получать уведомления в результате асинхронно (синхронно).

 Смежные вопросы

  • Нет связанных вопросов^_^