【问题标题】:C# shared variable differs between threadsC#共享变量在线程之间不同
【发布时间】:2018-12-15 05:08:03
【问题描述】:

在我当前的应用程序中,我发送一条 UDP 消息,如果数据包未被服务器确认,则在一秒钟后重新发送。现在我使用 volatile bool 作为终止标志,在主线程中,当收到 ACK 时,该标志设置为 true,如断点所确认,但在此之后,在“if(done) break;”期间在我的另一个线程中,标志仍然是假的。

   ThreadStart processTaskThread = delegate {
            send(text);
        };
        new Thread(processTaskThread).Start();  

 void send(string text)
    {
        while (true)
        {
            byte[] data = Encoding.ASCII.GetBytes(text);
            _socket.BeginSend(data, 0, data.Length, SocketFlags.None, (ar) =>
            {
                State so = (State)ar.AsyncState;
                int bytes = _socket.EndSend(ar);
                Console.WriteLine("SEND: {0}, {1}", bytes, text);
            }, state);
            Thread.Sleep(1000);
            if (kill) break;
        }
    }

现在,这里的标志被断点确认正确设置为真:

  private void Receive()
    {
        _socket.BeginReceiveFrom(state.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv = (ar) =>
        {
            State so = (State)ar.AsyncState;
            int bytes = _socket.EndReceiveFrom(ar, ref epFrom);
            _socket.BeginReceiveFrom(so.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv, so);
            try { 
            string Rec = Encoding.ASCII.GetString(so.buffer, 0, bytes);

            if (Rec.StartsWith("ACK:"))
            {
                kill = true;
                return;
            }

但回到线程循环中的条件,它仍然是假的。任何帮助表示赞赏。

【问题讨论】:

  • 请提供说明问题的minimal reproducible example;我们可以把一些东西放在一个文件中并编译/运行。
  • “我发送一条 UDP 消息,如果数据包未被服务器确认,则在一秒钟后重新发送” - 听起来您应该使用 TCP,而不是 UDP。

标签: c# multithreading


【解决方案1】:

我猜你的kill var 不是静态的,volatile 并不意味着线程安全,因为你可以阅读here

每个线程都有自己的堆栈。如果要与多个线程共享,则需要将 kill 变量设为静态。目前,当您将其状态从 true 更改为 false 时,它​​会在第一个线程堆栈上更改,并且不会反映到第二个线程。

您需要将其设为静态并确保分配是线程安全的。这可以使用Interlocked 类来实现。

顺便说一句,在布尔值上使用互锁存在问题,如您所见here。解决方法是创建一个整数,将其递增并检查它是否大于零。

【讨论】:

  • 非常感谢你,男人中的上帝。
猜你喜欢
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2019-05-01
相关资源
最近更新 更多