c++ - AMQP-CPP,libev > 从另一个线程停止 ev_loop
问题描述
我使用带有后端的 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 工作线程开始的循环。
推荐阅读
- hyperledger-fabric - 如何确保一个链码被另一个链码调用
- spring - 当 Spring 上下文初始化失败时如何中断集成测试?
- react-native - 如何延迟 Redux Persist Gate 的 SplashScreen?
- javascript - 在 Firefox 中使用 AJAX 动态加载数据列表选项
- python - 在 MatPlotLib 中绘制退化的余弦函数
- c# - 删除后序列化模型
- firebase - 反应本机堆栈跟踪
- docker - 哪些 API 对象支持配额,Kubernetes kubectl
- sql - SQL Server 外部应用查询优化
- azure - 来自在 ARM 模板中创建的对象的机密是否可以自动添加到 Key Vault