我目前正在进行一项需要通过网络进行通信的项目,并且正在使用ZMQ。该项目的主要目标是建立一个中央节点,为任何时候可以连接的客户提供服务。对于每个连接的客户端,中央节点应该产生相应的工作者线程并代理两者之间的通信。所有的通信都是通过tcp进行的。ZMQ经销商 - 路由器 - 经销商模式
客户端和工作人员需要随时发送和接收消息,因此他们是ZMQ_DEALER
类型的套接字,中心节点是ZMQ_ROUTER
。
我有一个问题,一段时间后,中央节点(路由器和所有工人)中的所有线程都会死锁。在检查了所有ZMQ线程的堆栈后,它们全部被锁定在SockWaitForSingleObject
的win上,而poll
/epoll_wait
在Linux上。
我已能重现问题http://pastebin.com/aUTg7RJY(它在引擎收录,因为它是相当长)
在这个例子中,客户端是在同一个进程中的工人和所有的预连接有点小例子,但在他们不是真实的情况,但这并没有什么区别 - 在这两种情况下,问题都是一样的。
我试图修改示例代码使用inproc
协议为职工节点通信,但问题仍然存在http://pastebin.com/MJBHNyiF
我不知道是不是我的问题是与网络的架构或我滥用ZMQ库。我会感谢任何帮助!
我试图将其剥离到最低限度,这再现了为什么存在几个“丑陋”部分的问题。永远的阻塞只是为了让线程在调试过程中保持活跃状态。 我跳过所有空帧,因为网络的所有部分都是经销商/路由器,无论如何,即使我添加它们 - 没有任何变化。 感谢您查看此,但。 – posedion4o