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

Posted

技术标签:

【中文标题】ZMQ 套接字不是线程安全的,但我可以在不同的线程中使用 zmq_send() 和 zmq_recv() 吗?【英文标题】:ZMQ socket is not thread-safe, but can I use zmq_send() and zmq_recv() in different threads? 【发布时间】:2017-10-26 03:46:21 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

尽管如此,ZeroMQ 的众神和巫师都违背了你的意愿。

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

如果问这个“是使用 ZeroMQ 的正确方法吗?”,不要期望答案会违反所有文档中的警告,不要这样做。

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于ZMQ 套接字不是线程安全的,但我可以在不同的线程中使用 zmq_send() 和 zmq_recv() 吗?的主要内容,如果未能解决你的问题,请参考以下文章

ZMQ之多线程编程

将 ZMQ 上下文传递给线程

Zmq 上下文 - 我应该在新线程中创建另一个上下文吗?

消息队列库——ZeroMQ

异步写入套接字线程是不是安全?

为啥 zmq 将多条消息打包到一个 TCP 帧中?