【问题标题】:Is it safe in ZeroMQ to zmq_poll() a REP socket + send() from multiple threads?在 ZeroMQ 中从多个线程到 zmq_poll() 一个 REP 套接字 + send() 是否安全?
【发布时间】:2017-10-09 21:20:10
【问题描述】:

我想知道是否允许 ZeroMQ REP 套接字在一个线程中的传入数据上被 poll()-ed 并用于从另一个线程发送数据。

我试图遵循的想法如下:
REP 套接字不会收到任何东西,只要它没有对传入请求发送回复。因此,如果为这样的套接字调用 zmq_poll(),它只会阻塞(直到超时或永远)。

现在,虽然此套接字是传入数据的 zmq_poll() 调用的一部分,但如果另一个线程准备回复并使用此套接字发送此回复,会发生什么情况。

这样做是否安全,或者是否有可能出现竞争条件?

【问题讨论】:

    标签: multithreading sockets zeromq polling reply


    【解决方案1】:

    ZeroMQ 建立在一系列准则之上。

    零共享是这些核心准则之一。

    虽然用户可以自行冒险尝试共享,但 ZeroMQ 最佳实践避免这样做,除了极少数和非常特殊的情况,而不是在套接字级别。为了更高的整体性能和更低的延迟,套接字故意不是线程安全的。

    这就是为什么“如果另一个线程……会发生什么”这个问题听起来很合理,但不在 ZeroMQ 最佳实践区域的范围内。

    【讨论】:

    • 虽然我同意您的回答并且还了解到 ZeroMQ 套接字不是线程安全的,无法从多个线程中使用,但我仍然觉得我的用例并非如此。 REP 套接字可以读或写。如果应用程序以这种方式组织,在编写时进行轮询是否安全。 REP 保证在允许写入之前读取整个多部分消息。因此不可能同时轮询/写入。我只是想摆脱过滤。
    • 很高兴知道您同意所提供的答案。
    • ovanes,尚不清楚您希望通过这种方法获得什么。正如@user3666197 所说,ZeroMQ 套接字不是线程安全的。如果你真的想做,我建议你在一个测试程序中实现,循环运行,看看多长时间会失败。
    猜你喜欢
    • 1970-01-01
    • 2011-03-15
    • 2023-03-03
    • 2014-11-19
    • 2011-03-19
    • 2014-02-21
    • 2014-10-11
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多