3

我使用私有字段(PushSocket- zmq_push socket for netmq

private PushSocket _pushSocket;

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

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

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

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

4

2 回答 2

6

不,

在理解ZeroMQ专业级建议1的基础上:
不应设计线程间共享套接字的代码。

按照设计,可扩展的正式通信模式(也有点误导地称为套接字不是线程安全并且从未尝试过)
ZeroMQ

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

传福音就是这样说ZeroMQ的。

使困惑?np。
生气的?np。
零共享零锁定——尝试将其视为某种形式的碰撞避免,而不是必须从不受控制的并发破坏的烧毁的颠簸中筛出灰烬。


如果有疑虑

最好的选择是阅读 Pieter HINTJENS 的《Code Connected. Volume 1》一书,并花一些时间了解 Pieter 对可扩展代码设计原则的看法。

你很快就会爱上这种新的思维方式ZeroMQ

于 2016-02-06T22:39:48.523 回答
2

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),但仅此而已。

于 2016-07-31T04:19:18.077 回答