我正在开发一个通过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秒,每秒应将currentRequestsASecond
的值存储到当前第二个元素的数组中,每分钟包装并覆盖数组。
ADDING REQUEST COUNTER VALUE
的输出总是声明它正在添加0
,但currentRequestsASecond
在睡眠发生之前不会重置为0所以我做错了什么?
答案 0 :(得分:1)
您的processRequestsSecondArray()
函数看起来像是每秒执行一次:
从sleep_for()
电话中醒来。
将currentRequestsASecond
设为零。
返回while
循环的顶部。
可能计算并打印出阵列中的平均值。
将currentRequestsASecond
存储在requestsASecondForAMinute
的元素中。
再次致电sleep_for()
。
看到问题了吗?
currentRequestsASecond
期间对sleep_for()
所做的任何更改都会被删除,并且永远不会放入数组中。如果增量足以幸运地获得请求并且可能在非常短的时间内获取互斥锁processRequestsSecondArray()
解锁互斥锁,检查getApplicationStatus()
并立即锁定,那么您只能获得一个值互斥量。看起来你需要重新安排一些逻辑。