2015-07-10 100 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