【问题标题】:Can many threads send over a single ØMQ socket when mutexes are used?使用互斥锁时,多个线程可以通过单个 ØMQ 套接字发送吗?
【发布时间】:2014-10-03 12:06:34
【问题描述】:

ØMQ 的文档中提到:

单独的 ØMQ 套接字不是线程安全的,除非在将套接字从一个线程迁移到另一个线程时发出完整的内存屏障。

“完整的内存屏障”到底是什么意思?如果我将它与互斥锁同步,我可以让多个线程通过同一个 ØMQ 套接字发送吗?

【问题讨论】:

    标签: c concurrency mutex zeromq


    【解决方案1】:

    正如 Ulrich 所说,是的,您可以使用互斥锁同步对单个线程的访问,但实际上,您为什么要这样做?

    通常认为好的做法是仅从单个线程访问套接字,并使用消息在线程之间进行同步。像这样的:

    Worker thread 1
                    \
    Worker thread 2 - >  Control thread -> msg out
                    /
    Worker thread 3
    

    只有控制线程可以直接通过套接字发送消息。来自工作线程的消息将通过您将创建的 inproc zmq 套接字发送到控制线程。如果工作线程没有共享状态,控制线程一次只会处理一条消息,这样就不需要互斥锁。

    基于消息的设计比使用互斥锁的设计更容易实现和调试,也更容易维护。如果您可以更改设计以做到这一点,我建议您这样做。

    【讨论】:

    • 因为我使用的是 Python 的日志库,它使用互斥锁。我知道 inproc 套接字,但我不能在这里使用它们。
    • @rightfold 正如 John 所描述的,ZeroMQ 明确建议停止考虑阻塞(互斥量、信号量等)并避免共享。智能设计方法是在“消息传递”层之上安排信号和控制层,以实现您各自的设计需求。 将任何阻塞引入非阻塞世界听起来就像矛盾修饰法一样奇怪。 它可能有其特殊的“美感”,但现实生活中的谈话确实很少使用它们。如果您的目标是重复使用阻塞作为副作用,最好设计您自己的 ZMQ SIG-s。
    • 这是一个很好的观点,合作胜于竞争资源。
    • @user3666197 如果你想修补 Python 日志库,那么我完全愿意。
    • 我不明白为什么使用 Python 日志库会造成如此困难。您需要的是一个专用于处理日志的线程/进程,它单独与 Python 记录器对话,从而避免了对互斥体的需求。所有其他线程通过 ZeroMQ 消息将日志消息传递给日志线程。瞧瞧。
    【解决方案2】:

    获取互斥体意味着内存屏障。这基本上意味着写操作不能以跨越此操作的方式重新排序。总结:是的,使用互斥锁来保护对 ZMQ 套接字的访问就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      • 2021-02-19
      相关资源
      最近更新 更多