gpt4 book ai didi

c++ - 即使在上下文终止后 ZMQ recv() 仍在阻塞

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:57 30 4
gpt4 key购买 nike

我已尽力按照 ZMQ termination whitepaper 中的说明进行操作,但到目前为止我失败得很惨。我有一个父类,它生成一个监听器线程(使用 win32-pthreads )。

根据白皮书,终止时,我应该设置 _stopped 标志,删除上下文,这反过来会调用 zmq_term() 并释放阻塞 接收()。相反,我得到的是:

  • 调用 delete _zmqContext 会使应用程序崩溃(可能是段错误)
  • zmq_term(_zmqContext) 替换 delete 不会释放阻塞 recv()

我正在添加部分代码示例,该示例很长,因为我不确定哪部分可能很重要。

AsyncZmqListener.hpp:

class AsyncZmqListener
{
public:
AsyncZmqListener(const std::string uri);
~AsyncZmqListener();

bool Start();
void Stop();

private:
static void* _threadEntryFunc(void* _this);
void _messageLoop();

private:
bool _stopped;
pthread_t _thread;
zmq::context_t* _zmqContext;
};

AsyncZmqListener.cpp:

AsyncZmqListener::AsyncZmqListener(const std::string uri) : _uri(uri)
{
_zmqContext = new zmq::context_t(1);
_stopped = false;
}

void AsyncZmqListener::Start()
{
int status = pthread_create(&_thread, NULL, _threadEntryFunc, this);
}

void AsyncZmqListener::Stop()
{
_stopped = true;
delete _zmqContext; // <-- Crashes the application. Changing to 'zmq_term(_zmqContext)' does not terminate recv()
pthread_join(_thread, NULL); // <-- This waits forever
}

void AsyncZmqListener::_messageLoop()
{
zmq::socket_t listener(*_zmqContext, ZMQ_PULL);
listener.bind(_uri.c_str());

zmq::message_t message;
while(!_stopped)
{
listener.recv(&message); // <-- blocks forever
process(message);
}
}

附言

我知道这个related question ,但没有一个答案与白皮书中描述的干净退出流程完全匹配。如果必须的话,我会决定投票......

最佳答案

ZMQ recv() 在相关上下文终止后解除阻塞

我不知道发生这种情况时 recv() 会抛出 ETERM 异常。修改后的有效代码:

void AsyncZmqListener::_messageLoop()
{
zmq::socket_t listener(*_zmqContext, ZMQ_PULL);
listener.bind(_uri.c_str());

zmq::message_t message;
while(!_stopped)
{
try
{
listener.recv(&message);
process(message);
}
catch(const zmq::error_t& ex)
{
// recv() throws ETERM when the zmq context is destroyed,
// as when AsyncZmqListener::Stop() is called
if(ex.num() != ETERM)
throw;
}
}
}

关于c++ - 即使在上下文终止后 ZMQ recv() 仍在阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18811146/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com