相关疑难解决方法(0)

0MQ:如何以线程安全的方式使用ZeroMQ?

我阅读了ZeroMq指南,我偶然发现了以下内容:

你不能在线程之间共享ØMQ套接字.ØMQ套接字不是线程安全的.从技术上讲,它可以做到这一点,但它需要信号量,锁或互斥量.这将使您的应用程序变得缓慢而脆弱.在线程之间共享套接字远程理解的唯一地方是语言绑定,需要像套接字上的垃圾收集那样做魔术.

后来:

切记:除了创建它们的线程外,不要使用或关闭套接字.

我也明白ZeroMQ Context是线程安全的.

如果一个类在.Net中注册另一个类的事件,则可以从与创建监听器的线程不同的线程调用此事件.

我认为只有两个选项可以从事件处理程序中通过ZeroMQ-Sockets调度:

  • 将eventhandler-invoking-thread同步到Socket创建ZeroMQ-的线程
  • 通过使用threadsafe ZeroMQ-为eventhandler中的线程创建一个新的ZeroMQ- Socket/获取现有Socket的ZeroMQ-Context

似乎0MQ-Guide不鼓励第一个,我不认为为每个线程创建一个新的ZeroMq-Socket是高性能/可行的方式.

我的问题:
在事件处理程序中通过0MQ发布消息的正确模式(它的意图是什么)是什么?

此外,该指南的作者在编写时还考虑到.Net的ZeroMQ-Binding:

在线程之间共享套接字远程理解的唯一地方是语言绑定,需要像套接字上的垃圾收集那样做魔术.?

这里有一些示例代码来强调我的问题/问题:

public class ExampleClass
{
    public event EventHandler<ByteEventArgs> SomethinIsCalledFromAnotherThread;
}

public class ByteEventArgs : EventArgs
{
    public byte[] BytesToSend;
}


public class Dispatcher
{
    ZMQ.Context ctx;

    public Dispatcher(ZMQ.Context mqcontext, ExampleClass exampleClassInstance)
    {
        this.ctx = mqcontext;
        exampleClassInstance.SomethinIsCalledFromAnotherThread += new EventHandler<ByteEventArgs>(exampleClass_SomethinIsCalledFromAnotherThread);
    }

    void exampleClass_SomethinIsCalledFromAnotherThread(object sender, ByteEventArgs e)
    {
        // this method might be called …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading thread-safety zeromq

17
推荐指数
2
解决办法
1万
查看次数

标签 统计

.net ×1

c# ×1

multithreading ×1

thread-safety ×1

zeromq ×1