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 результатов.

0 ответов

Другие вопросы по тегам