1

我正在jzmq为我的项目使用包来通过网络进行通信。我正在使用DEALER ROUTER对。我读过带有DEALERandROUTER类型的套接字不是线程安全的。所以我不能在 2 个不同的线程上从同一个套接字发送或接收。

我的问题是
1 ) ZThreadjzmq 包中的类的目的是什么?

2)它是否处理这个线程不安全?

3) 如果从父线程及其子线程使用它,我可以从同一个套接字发送和接收ZThread吗?

Attached4) 还有和之间有什么区别AdetachedRunnable

4

1 回答 1

1

事实 #0:ZeroMQ 从来都不是线程安全的(有零共享 Zen)

尽管最近做出了一些努力(于 2017 年末发表了关于 4.2+ 的总体重新设计努力以消除这一已知的初始原则),但 ZeroMQ 教育材料尽可能地提供,并解释了为什么尝试在设计实践。


广告 2)

即使有人得到了一些 API 的承诺,也总是首先对性能进行基准测试,如果有人愿意为这种事后共享原则支付性能损失的成本。正如关于 ZeroMQ 原生 API 所指出的,基本上没有什么可共享的(有一个例外,有时可能有意义,即全局 Context()-instance )。线程可以从这样的全局 Context()-instance 中“借用”IO-socket 实例,但从不共享 socket-instances,因为在 ZeroMQ 本机 API 内部和下不能保证结果,因此即使承诺也不会更好所以“高于”任何更高级别的 API。


广告 3 ) 不,

根据 2 ),永远不要共享套接字,没有理由尝试这样做。如果管理资源(并且线程是资源中的一等公民),最好创建一个私有的、点对点的PAIR/PAIRPUSH/PULL(甚至与单工管道串联) over { inproc:// | ipc:// }-transport-class(inproc://出于性能动机的情况甚至可以使用另一个“co-本地隔离的”私有Context(0)实例,实际上完全没有 IO 线程)并享受适当的关注点分离,而对主要丢失的线程安全(如果不这样做)和性能的不利影响最小。

广告 1 + 4)

(CZMQ/3.0.1 API 文档) zthread - 使用系统线程(已弃用)
......
该类zthread包装了 OS 线程的创建。它创建看起来像普通 OS 线程的分离线程,或共享调用者的 ØMQ 上下文的附加线程,并获得inproc与父线程对话的管道。分离的线程根据需要创建自己的 ØMQ 上下文。注意:这个类已被弃用,取而代之的是zactor.

最好检查使用的本机 API、绑定/包装器版本和文档之间的版本变化。

然而,零共享 Zen 可能会引领您的脚步(如果选择的语言绑定允许您在设计决策中保持自由 - 阅读原始设计动机总是有助于理解 The Original 的性能和安全见解)。

于 2018-03-07T13:46:00.483 回答