AMQP-CPP, libev> stop ev_loop из другого потока - PullRequest
0 голосов
/ 05 сентября 2018

Я использую AMQP-CPP lib с libev backend. Я пытаюсь создать класс, который откроет соединение и будет потреблять. Я хочу запустить цикл соединения в рабочем потоке, чтобы не блокировать основной поток. Эта часть кода выглядит следующим образом

...
m_thread.reset(new std:thread([this]()
    {
        ev_run(m_loop, 0);
    }));
...

Тогда в какой-то момент я хочу остановить цикл. Я прочитал, что это можно сделать с помощью функции ev_break(). Однако его следует вызывать из того же потока, что и ev_run(). Дальнейший поиск показал, что функция ev_async_send() может сделать это, но я не могу понять, как это сделать.

Как я могу это сделать? Есть идеи?

1 Ответ

0 голосов
/ 07 сентября 2018

Вот пример:

void asyncCallback(EV_P_ ev_async*, int)
{
    ev_break(m_loop, EVBREAK_ONE);
}

void MyClass::stopLoop()
{
    ev_async_init(&m_asyncWatcher, asyncCallback);
    ev_async_start(m_loop, &m_asyncWatcher);
    ev_async_send(m_loop, &m_asyncWatcher);

    m_thread->join();
}

// in the class async watcher should be defined
ev_async m_asyncWatcher;

Вызывая функцию stopLoop() из другого потока, она останавливает цикл, запущенный из рабочего потока m_thread.

...