c++ - 计算每秒添加到队列的请求数 - 总是返回零

标签 c++ arrays fifo

我正在开发一个通过 API 接收请求并将它们添加到 FIFO 的项目。我希望能够记录收到的请求数(添加到队列中)和处理的请求数(从队列中删除)。目前我正在尝试接收第二个平均请求。

我通过一个包含 60 个元素的 longs 数组来做到这一点,每个元素将存储那一秒收到的请求数。

我正在使用以下方法执行此操作:

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 在 sleep 1 秒的数组中,每一秒都应该将 currentRequestsASecond 的值存储到当前第二个元素的数组中,每一分钟它都会换行并通过数组覆盖。

ADDING REQUEST COUNTER VALUE 的输出总是声明它正在添加 0currentRequestsASecond 直到之后才重置为 0 sleep 已经发生,所以我做错了什么?

最佳答案

您的 processRequestsSecondArray() 函数看起来每秒执行一次:

  1. sleep_for() 调用中唤醒。

  2. currentRequestsASecond 设置为零。

  3. 返回到 while 循环的顶部。

  4. 可能计算并打印出数组的平均值。

  5. currentRequestsASecond 存储在 requestsASecondForAMinute 的元素中。

  6. 再次调用sleep_for()

看到问题了吗?

sleep_for() 时间内对 currentRequestsASecond 所做的任何更改都会被清除,并且永远不会放入数组中。只有当增量幸运地碰巧在可能很短的时间内获得请求并获取互斥锁时,你才会在那里获得一个值 processRequestsSecondArray() 解锁互斥锁,检查 getApplicationStatus (),并立即再次锁定互斥量。看来您需要重新安排其中的一些逻辑。

关于c++ - 计算每秒添加到队列的请求数 - 总是返回零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46574676/

相关文章:

arrays - 搜索数组所有元素中的特定属性是否匹配条件

python - 在 numpy 数组中查找连续的零

java - java中正确使用的数据结构是什么?

c++ - 如何通过c++获取图像的所有像素数据(RGB)

c++ - 多个数据成员的 const 初始化

c - 将随机数输入数组

C - 创建/写入/读取命名管道

c++ - 删除 vector 中指针的适当方法

c++ - 运行时检查失败 #0 C++

bash - 关于 FIFO 和文件描述符的问题