2017-08-21 23 views
1

IはConcurrentQueueからそうのようなパケットを送信する連続ループを有する:基本的なQoSアルゴリズム?

ConcurrentQueue<packet> queue = new ConcurrentQueue<packet>(); 

    while(true){ 
     packet data; 
     if (!queue.TryPeek(out packet)) continue; 
     send(data); 
     queue.TryDequeue(out data); //remove sent packet from the queue 
    } 

特定のポート上の各パケット等、(ヌル、低、中、高)、

public struct packet 
    { 
     public byte[] data; 
     public uint Length; 
     public address addr; 
     public string priority; 
    } 
を割り当てられた優先度を有しています

キュー内の他のパケットをブロックすることなく、優先順位の高いパケットを最初に送信するために使用できるアルゴリズムはどれですか?

例:

while(true){ 
     packet data; 
     if (!queue.TryPeek(out packet)) continue; 
     foreach(packet x in queue) 
     { 
      if(x.priority == "high") 
      { 
       send(data); 
       queue.TryDequeue(out data); 
      } 
     } 
     send(data); 
     queue.TryDequeue(out data); 
    } 

例は、キュー内の最初のパケットが送信され、除去されるようにのみ動作しません。 これが正しい方法であるかどうかはわかりません。

答えて

2

私は4つの異なるキューを使います。優先度ごとに1つのキュー。ような何か:

while(true){ 
    packet data; 
    if (highPriorityQ.TryDequeue(out data)) 
    { 
      send(data); 
      continue; 
    } 

    if (mediumPriorityQ.TryDequeue(out data)) 
    { 
      send(data); 
      continue; 
    } 

    // ... 
} 

だけでいくつかの提案:使用TryDequeue直接、あなたはTryPeekTryDequeue間のデッドロックに実行することができます。また、While(true)を避けてください。この質問を参照してくださいIs it safe to put TryDequeue in a while loop?

+0

'TryDequeue'を直接使う方法を教えてください。私は提供されたスタックリンクを読んだが、私は問題がどうなるかは分からない。私は 'TryDequeue'の前に' if(highPriorityQ.IsEmpty)continue;で待ち行列が空でないことを確認してデッドロックを防ぎますか? – Tod

+0

'TryPek'を呼び出す代わりに、' TryDequeue'を呼んでいる間に、 'TryDequeue'を呼び出すことは、キューが空でもTryDequeueが例外をスローしないので – Mhd