如何使队列从FIFO模式切换到优先模式?

时间:2012-09-25 00:32:56

标签: oop algorithm language-agnostic

我想实现一个能够在FIFO模式和优先模式下运行的队列。这是一个消息队列,优先级首先基于消息类型:例如,A类型的消息的优先级高于B类型的消息,因此所有A类型的消息都会先出列,最后B类型的消息会出列。

优先级模式:我的想法包括使用多个队列,每个队列对应一种类型的消息;通过这种方式,我可以根据消息类型管理优先级:只需先从队列中获取更高优先级的消息,然后逐步从优先级较低的队列中获取。

FIFO模式:如何使用多个队列处理FIFO模式?换句话说,用户看不到多个队列,但它使用队列就好像它是单个队列一样,这样消息就会在优先级模式被禁用时按照它们到达的顺序离开队列。为了实现第二个目标,我考虑使用另一个队列来管理消息类型的到达顺序:让我用以下代码片段更好地解释。

int NUMBER_OF_MESSAGE_TYPES = 4;
int CAPACITY = 50;
Queue[] internalQueues = new Queue[NUMBER_OF_MESSAGE_TYPES];
Queue<int> queueIndexes = new Queue<int>(CAPACITY);

void Enqueue(object message)
{
    int index = ... // the destination queue (ie its index) is chosen according to the type of message.
    internalQueues[index].Enqueue(message);
    queueIndexes.Enqueue(index);
}

object Dequeue()
{
    if (fifo_mode_enabled)
    {
        // What is the next type that has been enqueued?
        int index = queueIndexes.Dequeue();

        return internalQueues[index].Dequeue();
    }

    if (priority_mode_enabled)
    {
        for(int i=0; i < NUMBER_OF_MESSAGE_TYPES; i++)
        {
            int currentQueueIndex = i;
            if (!internalQueues[currentQueueIndex].IsEmpty())
            {
                object result = internalQueues[currentQueueIndex].Dequeue();

                // The following statement is fundamental to a subsequent switching
                // from priority mode to FIFO mode: the messages that have not been
                // dequeued (since they had lower priority) remain in the order in
                // which they were queued.
                queueIndexes.RemoveFirstOccurrence(currentQueueIndex);

                return result;
            }
        }
    }
}

您如何看待这个想法? 是否有更好或更简单的实现?

1 个答案:

答案 0 :(得分:2)

应该有效。然而,简单一瞥我的想法

a)不是线程安全的,并且做了很多工作。 b)非异常安全 - 即排队或出队的异常可能会留下不一致的状态 - 可能不是问题,例如如果一个例外是致命的,但也许是。 c)可能过于复杂和脆弱,虽然我不知道它正被使用的背景。

除非我进行了分析并且表明存在性能问题,否则我会有一个“容器”,优先级模式将遍历容器,寻找下一个最高优先级的消息 - 毕竟它只有50条消息。我几乎肯定会使用链表。我的下一个优化是将一个容器指向每个消息类型的第一个容器到该容器中,并更新消息的de-queue上的指针。