Имеется такая функция, которая нужно выполнять одновременно в 100 потоков.
void tryURL()
{
randURL.clear();
for (unsigned short i = 0; i < urlLength; i++) {
randURL = randURL + alphabet[getRand()];
}
if (SUCCEEDED(URLDownloadToFile(NULL, LPCWSTR((beginURL + randURL + endURL).c_str()), LPCWSTR((randURL + L"/" + endURL).c_str()), 0, NULL)))
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), GREEN);
wcout << L"Downloaded! " << endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE);
}
}
Распараллелил так:
while (1) {
for (int i = 0; i < threadsCount; ++i) {
thr[i] = thread(tryURL);
}
cout << "100 threads done" << endl;
for (int i = 0; i < threadsCount; ++i) {
thr[i].join();
}
cout << "100 threads joined" << endl;
}
Но при этом эта функция не посылает более 4 запросов одновременно. Может, где то надо отключить лимитирование по ядрам процессора? Уже переломал всю голову, никак не могу найти в чём проблема. С источником рандома всё нормально, используется системный.
Скорее всего, дело не в потоках, а в ограничениях используемого сетевого стека.
В WinInet (а urlmon.dll, в которой реализована функция URLDownloadToFile, использует именно её) есть лимит на число одновременных соединений с сервером.
По умолчанию этот лимит равен 2 для HTTP 1.1 и 4 для HTTP 1.0.
Исправить ситуацию можно руками, вызвав при старте приложения примерно такой код:
void FixMaxConnsPerServerLimit()
{
DWORD maxConns = 100;
InternetSetOption(NULL, INTERNET_OPTION_MAX_CONNS_PER_SERVER, &maxConns, sizeof(DWORD));
InternetSetOption(NULL, INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER, &maxConns, sizeof(DWORD));
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости