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() 吗?的主要内容,如果未能解决你的问题,请参考以下文章