2015-07-10 97 views
-2

我有100个线程,我想确保一次最多三个线程按顺序运行。从100个线程同步输出

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

Thread1 
Thread2 
thread3 
' 
' 
' 

但在同一时间只有三个线程是允许的。从1,2,3的任何线程完成后。顺序中的下一个线程应该开始。

我知道我们可以使用semaphoreslim做,但很想知道用互斥或其他方式回答。

假设我有应用程序,可以最大服务器在同一时间3个请求。但是,我得到100个请求,并希望以最多3次的先进先出顺序对它们进行服务。希望这清除了疑问,

+2

'1,2,3中的任何线程完成后。顺序的下一个线程应该开始。“我不太清楚你要求什么。你想要按顺序运行100个线程吗?如果是这样,为什么? – Rob

+3

如果线程必须按顺序完成,那么使用它们毫无意义。 [在C#中互斥的用法]的 – Blorgbeard

+0

可能重复(http://stackoverflow.com/questions/5754879/usage-of-mutex-in-c-sharp) –

回答

2

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

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

+0

我在说使用线程池是解决问题的办法。 –

+0

@MickyDuncan只要你不知道为什么海报指定了三个线程,那么你不知道这是否是一个理想的解决方案。此解决方案是控制同时执行的并发线程数的理想解决方案。多线程独立于内核的数量! –

+0

这是回复您删除的评论。无论如何,我已经编辑了我的答案。 –

0

您应该保存自己使用的原纱的痛苦,选择一个框架,做所有的辛勤解除你的。

我会建议使用的Mircosoft的反应框架(的NuGet “RX-主”)这一点。该代码是超级简单:

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();停止计算。

+1

但是这三个三要按顺序。即0,1,2,3,... –

+0

@SuyogShah - 如果它们运行在不同的线程上,则不适用。你希望他们运行在不同的线程**和**按顺序? – Enigmativity