@0Z0SK0

Почему libcurl не работает асинхронно?

При помощи curl_easy, каждый завернутый в std::async скачиваю файлы.
Создано 3 асинхронных запроса, но возникает проблема когда один из запросов натыкается на крупный файл и начинает его скачивать, от этого зависает вся программа. Выходит так что асинхронные запросы, совершенно не асинхронные.

using namespace std;

int allGameFileCount = 9999; // Здесь записывается кол-во нужных файлов
string allGameFiles[10000] = {}; // Здесь записаны названия файлов

bool downloadFile(const char* filename, const char* out)
{
    CURL* curl;
    curl = curl_easy_init();
    if (curl)
    {
        FILE* fp;
        fp = fopen(out, "wb");
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlWriteToFile);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        CURLcode result = curl_easy_perform(curl);

        long httpStatusCode = 0;
        curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpStatusCode);
        if (result == CURLE_OK && httpStatusCode == 200)
        {
            // Success
            curl_easy_cleanup(curl);
            fclose(fp);
            return true;
        }
        fclose(fp);
    }
    curl_easy_cleanup(curl);
    return false;
}

int main() {
       future<void> f1 = async(launch::async, [] {
				if (downloadGameFile(allGameFiles[allGameFileCount].c_str(), allGameFiles[allGameFileCount].c_str()))
				{
					allGameFiles[allGameFileCount] = "";
					allGameFileCount--;
				}});

       future<void> f2 = async(launch::async, [] {
				if (downloadGameFile(allGameFiles[allGameFileCount-1].c_str(), allGameFiles[allGameFileCount-1].c_str()))
				{
					allGameFiles[allGameFileCount-1] = "";
					allGameFileCount--;
				}});

       future<void> f3 = async(launch::async, [] {
				if (downloadGameFile(allGameFiles[allGameFileCount-2].c_str(), allGameFiles[allGameFileCount-2].c_str()))
				{
					allGameFiles[allGameFileCount-2] = "";
					allGameFileCount--;
				}});
}
  • Вопрос задан
  • 240 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы