C++ cpprest проблема с асинхронными вызовами, вызывающая исключения памяти
Я пытался выяснить, почему происходит в течение недели или около того, но теперь сдался и ищу любую помощь. Я использую MS cpprest casablanca SDK для выполнения вызовов покоя в нашей среде и использую асинхронные вызовы в других задачах, но этот исходный код вызывает исключение из памяти примерно в 80% случаев при его запуске.
Вот мой код для начала. Это основной цикл:
Info info[255]; //contains modifiable information used in calls
Rest rest[4]; //used for tracking the server info and tokens for each server connection
std::vector<concurrency::task<void>> vAccountID;
Concurrency::task<void> accountID;
std::vector<bool> vRestCallFinished;
bool done = false;
int threads = 16;
int counter = 0;
int checker = 0;
for (int i = 0; i < threads; i++) {
vAccountID.push_back(accountID);
vRestCallFinished.push_back(true);
}
while (t < threads) {
UpdateInfo(info[counter]); //updates the info class with new info for the rest calls triggers end to true when finished
try {//create the initial calls and store them in a vector
vAccountID[counter] = GetAccountIDThreaded(info[counter], rest[checker]);
}
catch (const std::exception &e) {
std::cout << "Exception has occured!\n" << e.what();
}
checker++;
if (checker == vServers.size())
checker = 0;
t++;
counter++;
}
while (done == false) {
if (counter == threads)
counter = 0;
if (CheckThread(counter) == true) {
vRestCallFinished[counter] = true;
DecodeResponse(info[counter], Log);
if (end == true) {
int doneCounter = 0;
for (int i = 0; i < vRestCallFinished.size(); i++) {
if (vRestCallFinished[i] == true)
doneCounter++;
}
if (doneCounter == vRestCallFinished.size()) {
done = true;
}
else
doneCounter = 0;
}
else {
UpdateInfo(info[counter]);
CreateThread(counter, checker);
vRestCallFinished[counter] = false;
checker++;
if (checker == vServers.size())
checker = 0;
}
}
counter++;
}
Это код, который проверяет, завершен ли вызов:
bool CheckThread(int thread) {
if (vAccountID[thread].is_done() == true)
return true;
else
return false;
}
Это функция, которая создает новый асинхронный вызов и получает ошибку исключения:
CreateThread(int thread, int server) {
vAccountID[thread] = GetAccountIDThreaded(info[thread], rest[server]); /*error thrown here. Error: Unhandled exception at 0x0F803E23 (msvcp140d.dll) in AsyncRest.exe: An invalid parameter was passed to a function that considers invalid parameters fatal.*/
total++;
}
Кажется, что около 80% происходит, что один или два асинхронных вызова не будут завершены в течение очень долгого времени, в то время как 14 других асинхронных потоков завершат по 7 вызовов каждый. Теперь, когда один из этих вызовов, который зависает, наконец возвращает true из функции CheckThread, Visual Studio выдает исключение Memory:
void _Decref()
{ // decrement use count
if (_MT_DECR(_Uses) == 0)
{ // destroy managed resource, decrement weak reference count
_Destroy(); // Exception thrown here
_Decwref();
}
}
Я просматриваю автомобили в visual studio, и все переменные имеют правильную информацию, которая им нужна. Если я выполняю программу и получаю триггер точки останова каждые 50 вызовов, программа будет работать нормально. Если я просто позволяю ему работать самостоятельно, он делает более 120 вызовов, затем выдает исключение памяти, и я замечаю, что это всегда происходит, когда один из асинхронных потоков говорит, что vAccountID[0] завис очень долго и просто возвращает 1 результат, в то время как остальные вернули около 6-7 результатов.