C++ 计算每秒添加到队列的请求数-始终返回为零

C++ 计算每秒添加到队列的请求数-始终返回为零,c++,arrays,fifo,C++,Arrays,Fifo,我正在从事一个项目,该项目通过API接收请求并将其添加到FIFO。我希望能够记录在队列中添加的接收请求数和从队列中删除的处理请求数。目前,我正在努力使请求获得第二个平均值 我通过一个包含60个元素的long数组来实现这一点,每个元素将存储在那一秒钟内接收到的请求数 我使用以下方法进行此操作: if (fifo->enqueue(crashInfo)) { this->requestProcessMutex.lock(); this->cu

我正在从事一个项目,该项目通过API接收请求并将其添加到FIFO。我希望能够记录在队列中添加的接收请求数和从队列中删除的处理请求数。目前,我正在努力使请求获得第二个平均值

我通过一个包含60个元素的long数组来实现这一点,每个元素将存储在那一秒钟内接收到的请求数

我使用以下方法进行此操作:

if (fifo->enqueue(crashInfo))
    {
        this->requestProcessMutex.lock();
        this->currentRequestsASecond++; //Used to get the total requests a second
        this->requestProcessMutex.unlock();
        cout << "Current Requests Incremented to " << this->currentRequestsASecond << endl;
        return true;
    }
    else
    {
        return false;
    }
从上面的代码中,cout显示计数器正在递增,然后按预期每秒重置为0

为了在一秒钟内将请求添加到阵列中,我执行以下操作,并且每10秒注销一次当前的平均值

void FIFOManager::processRequestsSecondArray()
{
    int counter = 0;
    time_t lastLoggedTime = std::time(NULL);
    while (this->bitsLibrary->getApplicationStatus() != StatusManager::ApplicationStatus::Stopping)
    {

        this->requestProcessMutex.lock();
        time_t current_time = std::time(NULL);
        long timeDiff = current_time - lastLoggedTime;
        if (timeDiff >= 10) //Only log every 10 seconds
        {
            stringstream logstream;
            logstream << this->getAverageRequestProcessTime(AverageRetrievalType::RequestsASec) << " requests received a second";
            this->bitsLibrary->writeToLog(logstream.str(), "FIFOManager", "processRequestsSecondArray");
            lastLoggedTime = std::time(NULL);
        }
        requestsASecondForAMinute[counter] = this->currentRequestsASecond;

        cout << "ADDING REQUEST COUNTER VALUE " << this->currentRequestsASecond << " AT " << counter << endl;
        if (counter < 59)
        {
            counter++;
        }
        else
        {
            counter = 0; //Only storing a minutes worth (60 secondS) so reset and start to overwrite
        }
        this->requestProcessMutex.unlock();
        this_thread::sleep_for(chrono::seconds(1));
        this->requestProcessMutex.lock();
        this->currentRequestsASecond = 0;
        this->requestProcessMutex.unlock();
    }
}
processRequestsSecondArray位于休眠1秒的数组中,每秒应将CurrentRequestsSecond的值存储到当前第二个元素的数组中,每分钟通过数组进行包装和覆盖

“添加请求计数器值”的输出总是表示它正在添加0,但CurrentRequestsSecond直到睡眠发生后才重置为0,所以我做错了什么?

processRequestsSecondArray函数看起来像是每秒执行一次:

从睡梦中醒来打电话

将CurrentRequestsAsSecond设置为零

返回while循环的顶部

可能计算并打印出数组中的平均值

将CurrentRequestsAsSecond存储在RequestsAsSecondForaMinute元素中

再打电话给sleep_

看到问题了吗


在睡眠时间内对CurrentRequestsAsSecond所做的任何更改都将被清除,并且永远不会放入阵列中。只有当增量碰巧在很短的时间内收到请求并获取互斥体时,才会在那里得到一个值RequestsSecondArray解锁互斥体,检查getApplicationStatus,并立即再次锁定互斥体。看起来你需要重新安排一些逻辑。

Duh现在很明显,一直盯着它看了很久,却看不到。在while循环中将计数器插入数组后,我将计数器的重置值直接移动到了0。谢谢你的帮助