我使用私有字段(PushSocket
- zmq_push套接字用于netmq)
private PushSocket _pushSocket;
以及在不同线程中使用此套接字的两种方法
public void Method1()
{
//.....//
_pushSocket.SendFrame(....);
//.....//
}
public void Method2()
{
//.....//
_pushSocket.SendFrame(....);
//.....//
}
我应该使用lock
或其他同步原语吗?
在了解ZeroMQ
专业级别建议No.1的基础上:
一个人不应该在线程之间设计共享套接字的代码。
按设计,
ZeroMQ
可扩展的正式通信模式(a.k.a。有点误导性地昵称为socket(s))
不是线程安全的(并且从未尝试过)。
一个人的能力以某种方式调解线程间信令并不是一种信念,这是一个主要的信念,即良好的可扩展并行代码永远不会共享或阻塞。
因此说ZeroMQ
传福音。
困惑? NP。 愤怒? NP。 零共享,零锁定 - 尝试将其视为某种形式的避免碰撞,而不是必须从不受控制的并发混乱的烧毁中剔除灰烬。
一个是最好的选择,阅读Pieter HINTJENS的书“Code Connected。第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),但就是这样。