gpt4 book ai didi

c - zmq_ctx_term() 在套接字关闭时阻塞

转载 作者:行者123 更新时间:2023-12-01 19:23:23 25 4
gpt4 key购买 nike

我正在使用 ZMQ,并且在销毁上下文时遇到问题。

我有代码

zmq_ctx_shutdown(context);
zmq_ctx_term(context);

此代码始终在 zmq_ctx_term() 上阻塞,并且还会在 zmq_ctx_destoy() 上阻塞;但是,如果删除该调用并且仅使用关闭调用,则一切似乎都工作正常,但应用程序将因不释放 zmq 上下文而泄漏内存。

在我的代码中,我有四个套接字:两个 ZMQ_PAIR inproc 套接字,用于在主线程和具有 ZMQ_REP 的线程之间进行通信。 code> 套接字,以及在主线程上运行的 ZMQ_PUB

我已将所有这些套接字上的 ZMQ_LINGER 设置为 0,因为似乎 zmq_ctx_term() 调用应该阻塞的唯一时间是消息尚未发送时因为我在所有套接字上调用了 zmq_close() ,它没有错误地返回。此外,如果我只调用 zmq_ctx_new(),创建套接字,然后调用 zmq_ctx_shutdown();,这种阻塞仍然会发生。 zmq_ctx_term();.

我担心使用两个 inproc 套接字在具有相同 zmq 上下文的线程之间进行通信会出现问题,尽管在消息传递时通信似乎没有任何问题已收到。

在担心我可能会遇到线程安全问题后,我发现 ZMQ 上下文应该是线程安全的,但套接字不是。我已经检查过,在主线程中,我正在打开和关闭 ZMQ_PUB 套接字和 inproc 套接字。在另一个线程中,我正在打开和关闭 ZMQ_REP 套接字以及 inproc 套接字的另一端,因此看来这不应该成为问题。

为了澄清起见,我正在使用 GitHub 上当前 master 分支的 libzmq(提交 d35473e)用 C 语言编写代码。在链接 ZMQ 的共享库时,我确实看到了类似的问题,尽管无论我使用静态库还是共享库都会发生这种情况。我目前使用的是 OS X 10.9。

如果有人有时间整体查看代码,相关文件已列出 here .

知道这里发生了什么吗?

最佳答案

观察结果:

我也遇到了同样的问题。尽管我正在关闭 ZMQ_REQ 类型的套接字,并且 zmq_close() 返回 0zmq_ctx_term() 仍然会阻塞。仅在向未运行的对等点发送消息后才会发生这种情况。

zmq_send() 会立即返回,但 zmq_recvmsg() 会超时。

之后我关闭套接字并调用zmq_ctx_term()。显然,尽管 zmq_close() 返回 0,但发送的消息仍在传出队列中,因此 zmq_ctx_term() 会阻塞。

解决方案:

我通过将 ZMQ_LINGER 选项设置为 ZMQ_RCVTIMEO 值的一半解决了该问题。这种行为实际上是在这里描述的 http://api.zeromq.org/4-0:zmq-ctx-term

关于c - zmq_ctx_term() 在套接字关闭时阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30308992/

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