ZMQ 套接字不是线程安全的,但我可以在不同的线程中使用 zmq_send() 和 zmq_recv() 吗?



我知道ZMQ不是线程安全的。

但是我想使用一个线程接收数据:zmq_poll()等待数据来,然后使用zmq_recv()接收数据;使用另一个线程发送数据:zmq_send()

我想知道这是使用ZMQ的正确方法吗?事实上,我已经尝试过了。调用时程序核心转储zmq_poll()一次,但它只发生一次,无法再次出现。

好吧,没有人可以阻止你尝试这个想法。

然而,所有的零MQ神和巫师都违背了你的意愿。

如果你确实知道你打算做什么,以便处理所有的多线程歧义,你可以自由地去尝试一下。

如果询问这是否"是使用ZeroMQ的正确方法?",不要指望答案违反了所有文档表达的警告不要这样做。

无论如何,享受像ZeroMQ这样的伟大工具,用于设计智能,可扩展,低延迟,高性能的分布式异构系统。

ZMQ 上下文是单个进程中所有套接字的容器,当然是线程安全的。ZMQ 套接字不是线程安全的,不应在线程之间共享。因此,ZMQ 指南建议为每个线程创建一个专用的inproc套接字。这为您提供了一种非常简单而可靠的方法,可以在一个进程中连接线程,而无需复杂的线程同步机制。

我个人的经验是,使用队列在线程之间共享消息比使用 zmq 套接字更安全。我尝试在多线程应用程序中使用 inproc zmq 线程 PUB/SUB,它在我的 MACOS Darwin Kernel Version 20.6.0 x86_64上运行良好,但是当将其移动到 Centos 7 x86_64 GNU/Linux时,inproc 线程无法在没有coredump的情况下接收任何消息。

最新更新