Не Называйте Потоки Из Threadpool При Отладке В Vs.

Где-то в 2017 году при отладке в VS производительность в проекте упала на ~80%, превратив игру в набор различных асинхронных кадров.

Виновником торжества стала функция SetThreadName внутри пула.

Для тех, кто незнаком, ThreadPool — это своего рода менеджер, отвечающий за параллельное выполнение одного и того же кода.

Например, вот так можно распределять циклы.

Суть его в том, чтобы создать несколько потоков (по 1 рабочему на каждое ядро) и перевести их в режим ожидания/удаление по завершении работы.

SetThreadName выглядел так:

   

void SetThreadName(DWORD dwThreadID, const char* threadName) { THREADNAME_INFO info; info.dwType = 0x1000; info.szName = threadName; info.dwThreadID = dwThreadID; info.dwFlags = 0; #pragma warning(push) #pragma warning(disable: 6320 6322) __try{ RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR*)&info); } __except (EXCEPTION_EXECUTE_HANDLER){ } #pragma warning(pop) }

В новом WinSDK старый добрый хак с RaiseException можно заменить на SetThreadDescription , что в конечном итоге спасает ситуацию.

Потому что RaiseException — довольно медленная операция.

Оптимальных выходов из ситуации было несколько:

  1. Ни в коем случае не называйте имена работников.

  2. Давай только при инициализации и сохраняй треды в режиме ожидания.

    Этот метод плох при присоединении к работающему процессу — мы уже не распознаём имена.

  3. Рабочие не уничтожаются.

    Каждая задача проверяется на наличие подключенного отладчика, если он был ранее отключен.

    IsDebuggerPresent

Теги: #Разработка для Windows #C++ #отладка #debug #threadpool #многопоточность #vs
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.