dan*_*ood 6 c sockets multithreading zeromq
我正在使用 ZMQ 并在销毁上下文时遇到问题。
我有代码
zmq_ctx_shutdown(context);
zmq_ctx_term(context);
Run Code Online (Sandbox Code Playgroud)
这段代码总是阻塞zmq_ctx_term(),也会阻塞zmq_ctx_destoy();但是,如果删除该调用并且仅使用关闭调用,则一切似乎都可以正常工作,但是应用程序将因未释放 zmq 上下文而泄漏内存。
在我的代码中,我有四个套接字:两个ZMQ_PAIR inproc套接字用于在主线程和一个带有ZMQ_REP套接字的线程之间进行通信,还有一个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 上当前主分支中的 libzmq 用 C 编写代码(commit d35473e)。在链接 ZMQ 的共享库时,我确实看到了类似的问题,尽管无论我使用静态库还是共享库都会发生这种情况。我目前使用的是 OS X 10.9。
如果有人有时间从整体上看代码,这里列出了相关文件。
知道这里发生了什么吗?
小智 5
我有同样的问题。尽管我正在关闭ZMQ_REQ类型的套接字并zmq_close()返回0,zmq_ctx_term()但仍然会阻塞。仅在向未运行的对等方发送消息后才会发生这种情况。
zmq_send()会立即返回,但zmq_recvmsg()会超时。
之后我关闭了套接字并调用了zmq_ctx_term(). 显然,尽管zmq_close()返回了0,发送的消息仍然在传出队列中,因此zmq_ctx_term()会阻塞。
我通过将ZMQ_LINGERoption设置为ZMQ_RCVTIMEO. 这种行为实际上在这里描述
http://api.zeromq.org/4-0:zmq-ctx-term