【问题标题】:C# get max value from multiple threadsC#从多个线程中获取最大值
【发布时间】:2015-10-29 03:56:08
【问题描述】:

我有一个监听 TCP 客户端的 C# 服务器应用程序。每个客户端在服务器上创建一个新线程,它会每隔 10ms 向服务器传递一个整数值。

现在我需要从所有客户端获取最大整数并继续广播它,所以我认为问题是如何从不同线程中获取所有值并将它们进行比较?

【问题讨论】:

  • 线程将一个值传递给您的比较方法 - ShowMaxValue(maxValue) 然后将其与自己的总数进行比较 - if (maxValue > total) { total = maxValue; }
  • @Ben - 你需要某种形式的锁定来使它工作 - 否则这是一个等待发生的竞争条件。
  • @Enigmativity 等等。但在 OP 发布他们目前拥有的东西之前,我们可以提供许多东西作为解决方案。因为我们不知道他们的代码是什么,所以我们真的无法提供可行的解决方案。
  • 您是指每个人发送值的一个周期内最大的值,还是所有发送者的最大值?
  • 谢谢大家的回复,我希望所有发件人都能获得最大的价值。我还没有任何代码,我需要知道如何开始我的代码......我只是认为每个线程都有可能有自己的变量 a[i] 来存储值,我可以创建另一个线程来循环获取最大值,例如 int maxium = max(a)

标签: c# multithreading


【解决方案1】:

两个好的选项和一个好的选项:

  1. 使用ConcurrentQueue<int>,每个线程都在其中插入值,有一个读取器线程读取值并更新最大值。

  2. 使用跨线程共享的 volatile int 并使用 Interlocked.CompareExchange 在重试循环中以原子方式更新它(例如,类似于 this)。

  3. 在最大值计算附近使用lock 并更新volatile int

【讨论】:

  • 我想出了一个简单的解决方案,请帮忙更新...我完全不知道如何使用互锁...
【解决方案2】:

我想出了一个简单的解决方案

//先定义一个静态类...

public static class IntHolder
{
    public static int Value;
}

在线程中更新静态类的值,其他线程比较它,只有值更大才更新它。这样所有线程都可以访问同一个内存地址

if (IntHolder.Value < Int32.Parse(dataFromClient))
{
  IntHolder.Value = Int32.Parse(dataFromClient);
}

如果我错了,请纠正我...或者任何更好的解决方案,我知道它会有竞争条件,但我不确定如何使用锁定...

谢谢!

【讨论】:

    猜你喜欢
    • 2013-05-16
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 2016-03-17
    相关资源
    最近更新 更多