я использую AMQP-CPP возиться с libev
бэкенд. Я пытаюсь создать класс, который откроет соединение и будет потреблять. Я хочу запустить цикл соединения в рабочем потоке, чтобы не блокировать основной поток. Эта часть кода выглядит следующим образом
...
m_thread.reset(new std:thread([this]()
{
ev_run(m_loop, 0);
}));
...
Затем в какой-то момент я хочу остановить цикл. Я прочитал, что это можно сделать с ev_break()
функция. Однако он должен вызываться из того же потока, что и ev_run()
назывался. Больше поиска показало, что ev_async_send()
функция может сделать это, но я не могу понять, как.
Как мне это сделать? Есть идеи?
Вот пример:
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.
Других решений пока нет …