【发布时间】:2014-10-03 12:06:34
【问题描述】:
ØMQ 的文档中提到:
单独的 ØMQ 套接字不是线程安全的,除非在将套接字从一个线程迁移到另一个线程时发出完整的内存屏障。
“完整的内存屏障”到底是什么意思?如果我将它与互斥锁同步,我可以让多个线程通过同一个 ØMQ 套接字发送吗?
【问题讨论】:
标签: c concurrency mutex zeromq
ØMQ 的文档中提到:
单独的 ØMQ 套接字不是线程安全的,除非在将套接字从一个线程迁移到另一个线程时发出完整的内存屏障。
“完整的内存屏障”到底是什么意思?如果我将它与互斥锁同步,我可以让多个线程通过同一个 ØMQ 套接字发送吗?
【问题讨论】:
标签: c concurrency mutex zeromq
正如 Ulrich 所说,是的,您可以使用互斥锁同步对单个线程的访问,但实际上,您为什么要这样做?
通常认为好的做法是仅从单个线程访问套接字,并使用消息在线程之间进行同步。像这样的:
Worker thread 1
\
Worker thread 2 - > Control thread -> msg out
/
Worker thread 3
只有控制线程可以直接通过套接字发送消息。来自工作线程的消息将通过您将创建的 inproc zmq 套接字发送到控制线程。如果工作线程没有共享状态,控制线程一次只会处理一条消息,这样就不需要互斥锁。
基于消息的设计比使用互斥锁的设计更容易实现和调试,也更容易维护。如果您可以更改设计以做到这一点,我建议您这样做。
【讨论】:
获取互斥体意味着内存屏障。这基本上意味着写操作不能以跨越此操作的方式重新排序。总结:是的,使用互斥锁来保护对 ZMQ 套接字的访问就可以了。
【讨论】: