NetMq 套接字是线程安全的吗?

NetMq sockets are thread safe?

我使用私有字段(PushSocket - zmq_push 套接字用于 netmq

private PushSocket _pushSocket;

以及在不同线程中使用此套接字的两个方法

public void Method1()
{
    //.....//
    _pushSocket.SendFrame(....);
    //.....//
}

public void Method2()
{
    //.....//
    _pushSocket.SendFrame(....);
    //.....//
}

我应该使用 lock 还是其他同步原语?

没有,

在了解ZeroMQ专业级建议一:
不要设计线程间共享套接字的代码。

根据设计,
ZeroMQ S可扩展F普通C通信 Patterns (a.k.a。有点误导性地昵称为 socket(s) )
不是线程安全的 (并且从未尝试过).

相信一个人有能力以某种方式调解线程间信号并不是一件事情,主要的信念是,良好的可扩展并行代码应该永远不会共享,也不会阻塞 .

如是说ZeroMQ传福音。

困惑? np.
生气的? np.
Zero-sharing, Zero-locking -- 尝试将其视为某种形式的冲突避免,而不是从不受控制的并发破坏中烧焦的灰烬中筛出灰烬。


如有疑问

最好的选择是阅读 Pieter HINTJENS 的 书 "Code Connected. Volume 1" 并花一些时间了解 Pieters 关于可扩展代码设计原则的观点。

你很快就会爱上新的思维方式ZeroMQ-way。

ZeroMQ 套接字不是线程安全的。我通过以下方式使用 BlockingCollection 解决了类似的问题:

class MyClass 
{
    private PushSocket _pushSocket;

    private BlockingCollection<NetMQMessage> _toSend = new BlockingCollection<NetMQMessage>();

    MyClass() 
    {
        _pushSocket = new PushSocket();
        _pushSocket.Bind("someaddress");

        Task.Factory.StartNew(WorkerThread, TaskCreationOptions.LongRunning);
    }

    private void WorkerThread() 
    {
        while (true) 
        {
            NetMQMessage message = _toSend.Take();

            _pushSocket.SendMultipartMessage(message);
        }
    }

    public void Method1(NetMQMessage message) 
    {
        _toSend.Add(message);
    }

    public void Method2(NetMQMessage message) 
    {
        _toSend.Add(message);
    }
}

您还应该实施适当的处置(破坏 WorkerThread 和处置 _toSend),仅此而已。