计算每秒添加到队列的请求数 - 总是返回零
Calculate number of requests added to queue per a second - always comes back as zero
我正在开发一个通过 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
在数组中休眠 1 秒,每一秒应该将 currentRequestsASecond
的值存储到当前第二个元素的数组中,每分钟它通过大批。
ADDING REQUEST COUNTER VALUE
的输出总是说明它正在添加 0
但 currentRequestsASecond
直到睡眠发生后才重置为 0 所以我做错了什么?
您的 processRequestsSecondArray()
函数看起来每秒执行一次:
从sleep_for()
通话中醒来。
将 currentRequestsASecond
设置为零。
Return 到 while
循环的顶部。
可能计算并打印出数组的平均值。
在requestsASecondForAMinute
的一个元素中存储currentRequestsASecond
。
再次调用sleep_for()
。
看到问题了吗?
在 sleep_for()
时间内对 currentRequestsASecond
所做的任何更改都会被清除,并且永远不会放入数组中。如果增量足够幸运,碰巧在可能很短的时间内获得请求并获取互斥锁,你只会在那里得到一个值 processRequestsSecondArray()
解锁互斥锁,检查 getApplicationStatus()
,并立即锁定再次互斥。看来您需要重新安排其中的一些逻辑。
我正在开发一个通过 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
在数组中休眠 1 秒,每一秒应该将 currentRequestsASecond
的值存储到当前第二个元素的数组中,每分钟它通过大批。
ADDING REQUEST COUNTER VALUE
的输出总是说明它正在添加 0
但 currentRequestsASecond
直到睡眠发生后才重置为 0 所以我做错了什么?
您的 processRequestsSecondArray()
函数看起来每秒执行一次:
从
sleep_for()
通话中醒来。将
currentRequestsASecond
设置为零。Return 到
while
循环的顶部。可能计算并打印出数组的平均值。
在
requestsASecondForAMinute
的一个元素中存储currentRequestsASecond
。再次调用
sleep_for()
。
看到问题了吗?
在 sleep_for()
时间内对 currentRequestsASecond
所做的任何更改都会被清除,并且永远不会放入数组中。如果增量足够幸运,碰巧在可能很短的时间内获得请求并获取互斥锁,你只会在那里得到一个值 processRequestsSecondArray()
解锁互斥锁,检查 getApplicationStatus()
,并立即锁定再次互斥。看来您需要重新安排其中的一些逻辑。