【问题标题】:Synchronize output from 100 threads同步 100 个线程的输出
【发布时间】:2015-07-10 13:22:15
【问题描述】:

我有 100 个线程,我想确保一次最多三个线程按它们创建的顺序运行。

我有从 1 到 100 的数字。我想像下面这样打印它

Thread1
Thread2
thread3
'
'
'

但一次只允许三个线程。一旦完成了 1,2,3 中的任何线程。应该开始按顺序的下一个线程。

我知道我们可以使用 semaphoreslim,但很想知道使用 Mutex 或其他方式的答案。

假设我有一次最多可以处理 3 个请求的应用程序。但我收到 100 个请求,并希望以 FIFO 顺序为它们提供服务,一次最多 3 个。希望这能消除疑虑,

【问题讨论】:

  • Once any of thread from 1,2,3 is completed. Next thread in sequence should start. 我不太清楚你要什么。您想按顺序运行 100 个线程吗?如果有,为什么?
  • 如果线程必须按顺序完成,那么使用它们是没有意义的。
  • Usage of Mutex in c#的可能重复
  • 考虑一个场景,我的应用程序收到 1000 个请求,但我想确保以 FIFO 顺序一次只处理 3 个请求。我只是举了一个100个线程和数字的例子。
  • 我不确定上述 c# 中 Mutex 的用法。

标签: c# multithreading


【解决方案1】:

要同时运行最多三个线程,应使用大小为 3 的线程池。您应该实现一个线程池模式,将执行请求排入 FIFO 队列,并且最多限制同时执行三个请求。

线程池将保证您的请求开始以相同的顺序执行,因为它使用 FIFO 队列。但是,这并不能保证它们会以相同的顺序完成执行。

【讨论】:

  • 我是说使用线程池是解决问题的办法。
  • @MickyDuncan 只要你不知道为什么发帖人指定了三个线程,那么你不知道这是否是一个理想的解决方案。该解决方案是控制同时执行的并发线程数的理想解决方案。多线程也与内核数量无关!
  • 这是对您已删除评论的回复。无论如何,我已经编辑了我的答案。
  • 看起来更好。已删除反对票。祝你周末愉快
【解决方案2】:

您应该避免使用原始线程的痛苦,并选择一个可以为您完成所有繁重工作的框架。

我建议为此使用 Mircosoft 的反应式框架 (NuGet "Rx-Main")。代码超级简单:

var subscription =
    Observable
        .Range(0, 100)
        .Select(n => Observable.Start(() =>
        {
            Thread.Sleep(100);
            return n;
        }))
        .Merge(maxConcurrent: 3)
        .Subscribe(n => Console.WriteLine(n));

使用此代码,我得到以下结果:

1
3
2
0
5
6
7
4
8
9
...
95
97
96
98
99

你可以通过调用subscription.Dispose();来停止计算。

【讨论】:

  • @SuyogShah - 如果它们在不同的线程上运行,则不会。您希望它们在不同的线程上运行并且按顺序运行?
猜你喜欢
  • 2012-03-09
  • 1970-01-01
  • 2019-11-05
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
相关资源
最近更新 更多