Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cppzmq:是否有可能在不创建全局变量的情况下获取全局上下文?_C++_Zeromq - Fatal编程技术网

C++ cppzmq:是否有可能在不创建全局变量的情况下获取全局上下文?

C++ cppzmq:是否有可能在不创建全局变量的情况下获取全局上下文?,c++,zeromq,C++,Zeromq,我的用例通常只涉及一个全局上下文。好的,pyzmq有一个APIzmq.Context.instance()来获取全局单例,但是我找不到一个等价的cppzmqAPI 是否可以访问全局上下文而不必显式创建和跟踪它 Q:是否可以访问全局上下文而不必显式地创建它和跟踪它 不,至少在当前的cppzmq 原因: PyZMQ最近开始与普通python语言绑定不同,用于处理已发布的通用ZeroMQ API 不仅仅是绑定 PZZMQ表面上是用于Oy MQ的Python绑定,但该项目在Python的“包含电池”的

我的用例通常只涉及一个全局上下文。好的,pyzmq有一个API
zmq.Context.instance()
来获取全局单例,但是我找不到一个等价的
cppzmq
API

是否可以访问全局上下文而不必显式创建和跟踪它

Q:是否可以访问全局上下文而不必显式地创建它和跟踪它

不,至少在当前的
cppzmq

原因: PyZMQ最近开始与普通python语言绑定不同,用于处理已发布的通用ZeroMQ API

不仅仅是绑定

PZZMQ表面上是用于Oy MQ的Python绑定,但该项目在Python的“包含电池”的理念下,提供的不仅仅是Python方法和对象,用于调用O.MQC++库。 核心作为绑定

PyZMQ目前分为四个子包。首先是
核心
zmq.core
包含ZeroMQ的实际绑定,除了非常基本的功能外,没有扩展的功能。核心模块被拆分,这样每个基本的ZeroMQ对象(或函数,如果没有对象关联)都是一个单独的模块,例如
zmq.core.context
包含
对象,
zmq.core.poll
包含一个
Poller
对象以及
select()
函数,为了方便起见,ZMQ常量都保存在
ZMQ.core.constants

将核心分解为子模块有两个原因:重新编译和衍生项目。单片PyZMQ变得非常乏味,因为它需要重新编译所有内容,只需对单个对象进行一个小的更改。对于单独的文件,不再需要这样做。第二个原因与Cython有关。PyZMQ是用Cython编写的,Cython是为Python高效编写C扩展的工具。通过将我们的对象分离到单独的pyx文件中,每个文件的声明都在pxd头中,其他项目可以用Cython编写扩展名,并在C级直接调用ZeroMQ,而不必检查我们的Python对象

线程安全性

在ØMQ中,上下文是线程安全对象,但套接字不是。在整个多线程应用程序中使用单个
上下文
(例如,通过
zmq.Context.instance()
)是安全的,但您应该基于每个线程创建套接字。如果跨线程共享套接字,则很可能会遇到应用程序的uncatchablec-level崩溃,除非您明智地使用
线程。锁定
,但不建议使用此方法。

努力工作的ZeroMQ极客们已经注意到,最初的ZeroMQ API(早在v2.1.11+时代就开始)还有其他建议:

1) 应用程序必须明确创建至少一个
上下文
-实例(并在以后终止)

2)
上下文
-实例可以在线程间自由共享,而不需要在
上下文
-服务调用方端进行任何锁定


3) 即使将
Socket
-实例传递(非迁移)到新创建的线程(即,由不属于“外部”-
上下文的线程维护),也会授予线程安全性,PyZMQ文档从中明确警告并分散用户的注意力。

看起来您必须创建自己的单例并管理其生存期。单例被视为反模式,这是不使用它们的原因,更不用说将其作为默认设置了。再次。非常好的总结和资源。非常感谢。