在队列中设置限制

时间:2015-04-07 14:11:01

标签: c++ multithreading

我想对我的队列设置限制。您可以在下面找到Queue类的实现。

因此,简而言之,我想在一个线程中写入Queue直到极限,然后等待可用空间。第二个线程读取队列并使用它收到的数据执行一些操作。

int main()
{
    //loop that adds new elements to the Queue. 
     thread one(buildQueue, input, Queue); 

    loop{
        obj = Queue.pop()
        func(obj) //do some math
    }



}

所以问题是Queue构建到最后,但我想只设置10个元素,例如。程序应该像这样工作:

  1. 检查队列中的可用空间是否可用。
    1. 如果没有空间 - 等等。
    2. 在队列中写入,直到达到限制。

  2. 班级队列

    template <typename T> class Queue{
    private:
        const unsigned int MAX = 5;
        std::deque<T>           newQueue;
        std::mutex              d_mutex;
        std::condition_variable d_condition;
    public:
        void push(T const& value)
        {
    
            {
                std::unique_lock<std::mutex> lock(this->d_mutex);
                newQueue.push_front(value);
            }
            this->d_condition.notify_one();
        }
        T pop()
        {
            std::unique_lock<std::mutex> lock(this->d_mutex);
            this->d_condition.wait(lock, [=]{ return !this->newQueue.empty(); });
            T rc(std::move(this->newQueue.back()));
            this->newQueue.pop_back();
            return rc;
        }
    
        unsigned int size()
        {
            return newQueue.size();
        }
    
        unsigned int maxQueueSize()
        {
            return this->MAX;
        }
    
    };
    

    我在线程程序方面很新,所以我可能会误解这个概念。这就是为什么不同的提示被高度赞赏的原因。

1 个答案:

答案 0 :(得分:1)

您应该在MSDN website中研究过Queue类。它提供了Queue附带的广泛的信息循环方法。但是,要专门回答您的问题,要设置具有特定容量的队列,请执行以下操作:

Queue(int capacity)

类型System::int32容量是队列中元素的初始数量。然后,您的队列将被填充,直到达到限制。问题是,一旦填满,队列就不会“停止”。它将开始分配更多的内存,因为它本质上是在你的线程中(或由它的声音多线程),你必须确保根据时间处理队列内存的realoc-deallocation。您应该能够确定以所需容量填充队列所需的毫秒数并读取队列,同时清除队列。同样,您可以将队列内容复制到1D阵列,并使用MyQueue->Clear()清除完整队列,而无需逐个读取队列元素(如果时间和代码复杂性是个问题)。