Убедитесь, что libuv вызывает асинхронный обратный вызов

документация состояний libuv:

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

Итак, если мне нужна гарантия того, что каждый раз, когда я делаю вызов uv_async_send(), мой обратный вызов вызывается с правильной полезной нагрузкой, достаточно ли иметь отдельный дескриптор uv_async_t? Например, можно ли выделить новый uv_async_t в куче, заполнить его data член, вызвать uv_async_init и uv_async_send и в обратном вызове обработки закрыть дескриптор с помощью uv_close, а затем удалить его? Имеет ли значение, какой поток создает uv_async_t и какой поток вызывает uv_async_init?

ИЗМЕНИТЬ

  1. Согласно этому обсуждению это делает независимо от того, какой поток вызывает uv_async_init.
  2. Согласно ответу на предыдущий вопрос, необходимо позаботиться об удалении uv_async_t только после того, как обратный вызов закрытия, переданный uv_close, был был вызван.

person sigy    schedule 03.05.2017    source источник


Ответы (1)


Вы можете сделать это, используя потокобезопасную очередь и один асинхронный дескриптор. Когда вам нужно вызвать обратный вызов, создайте некоторую мягкую структуру для его хранения, поместите его в очередь и вызовите uv_async_send, затем в обратном вызове обработайте очередь, пока она не станет пустой.

person saghul    schedule 05.05.2017
comment
Я надеялся на более простое решение, но, если я правильно понимаю, теперь uv_async_init нужно вызывать до начала цикла, не так ли? - person sigy; 05.05.2017
comment
Не обязательно, но его нужно вызывать в потоке цикла. - person saghul; 06.05.2017