【问题标题】:ZeroMQ Kill Thread functionZeroMQ 杀死线程函数
【发布时间】:2014-06-21 22:22:36
【问题描述】:

我正在使用 ZeroMQ 创建项目。我需要函数来启动和终止线程。启动功能似乎工作正常,但停止功能有问题。

private Thread _workerThread;
private object _locker = new object();
private bool _stop = false;

public void Start()
    {
        _workerThread = new Thread(RunZeroMqServer);
        _workerThread.Start();
    }

    public void Stop()
    {
        lock (_locker)
        {
            _stop = true;
        }

        _workerThread.Join();
        Console.WriteLine(_workerThread.ThreadState);
    }

    private void RunZeroMqServer()
    {
        using (var context = ZmqContext.Create())
        using (ZmqSocket server = context.CreateSocket(SocketType.REP))
        {
            /*
            var bindingAddress = new StringBuilder("tcp://");
            bindingAddress.Append(_ipAddress);
            bindingAddress.Append(":");
            bindingAddress.Append(_port);
            server.Bind(bindingAddress.ToString());
            */

            //server.Bind("tcp://192.168.0.102:50000");
            server.Bind("tcp://*:12345");

            while (!_stop)
            {
                string message = server.Receive(Encoding.Unicode);
                if (message == null) continue;

                var response = ProcessMessage(message);
                server.Send(response, Encoding.Unicode);

                Thread.Sleep(100);
            }
        }
    }

也许有人对这个 Stop() 函数有任何想法,为什么它不会杀死线程? 我得到提示我应该使用 Thread.MemoryBarrier 和 volatile 但不知道它应该如何工作。 还有 ProcessMessage() 函数来处理消息,我只是没有复制它不要乱扔垃圾:)

【问题讨论】:

    标签: c# multithreading zeromq


    【解决方案1】:

    问题似乎是您正在调用ZmqSocket.Receive 的阻塞版本。在等待接收消息时,它不会处理您的其余代码,因此它永远不会达到循环条件。

    解决方案是使用一种非阻塞方法,或者一种具有超时的方法。试试这个:

    string message = server.Receive(Encoding.Unicode, TimeSpan.FromMilliseconds(100));
    

    如果没有收到消息,这应该在 100 毫秒后返回,或者如果有消息到达则更早。无论哪种方式,它都会在循环条件下得到一个镜头。


    至于 _stop 标志本身...

    当您从多个线程访问变量时,锁定是一个好主意。然而,在简单标志的情况下,读取和写入几乎都是原子操作。在这种情况下,将其声明为 volatile (private volatile bool _stop = false;) 就足以告诉编译器确保每次您告诉它时它总是实际读取当前值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多