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

问题描述 投票:3回答:2

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

private PushSocket _pushSocket;

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

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

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

我应该使用lock或其他同步原语吗?

c# multithreading zeromq low-latency netmq
2个回答
5
投票

没有,

在了解ZeroMQ专业级别建议No.1的基础上: 一个人不应该在线程之间设计共享套接字的代码。

按设计, ZeroMQ可扩展的正式通信模式(a.k.a。有点误导性地昵称为socket(s)) 不是线程安全的(并且从未尝试过)。

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

因此说ZeroMQ传福音。

困惑? NP。 愤怒? NP。 零共享,零锁定 - 尝试将其视为某种形式的避免碰撞,而不是必须从不受控制的并发混乱的烧毁中剔除灰烬。


如果有疑虑

一个是最好的选择,阅读Pieter HINTJENS的书“Code Connected。第1卷”并花些时间与Pieters对可扩展代码设计原则的看法。

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


1
投票

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),但就是这样。

© www.soinside.com 2019 - 2024. All rights reserved.