AMQP-CPP,libev>从另一个线程停止ev_loop

问题描述 投票:0回答:1

我使用AMQP-CPP lib和libev后端。我尝试创建一个将打开连接并进行消费的类。我想在工作线程中运行连接循环,以便不阻塞主线程。那部分代码看起来像这样

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

然后在某些时候我想停止循环。我已经读过可以用ev_break()函数来做到这一点。但是,应该从调用ev_run()的同一个线程中调用它。更多搜索显示ev_async_send()功能可能会这样做,但我无法弄清楚如何。

我该怎么做?有任何想法吗?

c++ rabbitmq amqp event-loop libev
1个回答
0
投票

这是一个例子:

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工作线程开始的循环。

© www.soinside.com 2019 - 2024. All rights reserved.