Я чувствую, что здесь что-то не хватает...
Я немного изменил код, чтобы перейти от использования std::thread
к std::async
и заметил существенное увеличение производительности. Я написал простой тест, который, как я полагаю, должен выполняться почти одинаково, используя std::thread
, поскольку он использует std::async
.
std::atomic<int> someCount = 0;
const int THREADS = 200;
std::vector<std::thread> threadVec(THREADS);
std::vector<std::future<void>> futureVec(THREADS);
auto lam = [&]()
{
for (int i = 0; i < 100; ++i)
someCount++;
};
for (int i = 0; i < THREADS; ++i)
threadVec[i] = std::thread(lam);
for (int i = 0; i < THREADS; ++i)
threadVec[i].join();
for (int i = 0; i < THREADS; ++i)
futureVec[i] = std::async(std::launch::async, lam);
for (int i = 0; i < THREADS; ++i)
futureVec[i].get();
Я не слишком углублялся в анализ, но некоторые предварительные результаты показали, что код std::async
работает примерно в 10 раз быстрее! Результаты немного менялись при оптимизации, я также попытался переключить порядок выполнения.
Является ли это проблемой компилятора Visual Studio? Или есть какая-то более глубокая проблема с реализацией, которую я пропускаю, учитывая эту разницу в производительности? Я думал, что std::async
является оберткой вокруг вызовов std::thread
?
Также учитывая эти различия, мне интересно, какой способ получить лучшую производительность здесь? (Есть больше, чем std:: thread и std:: async, которые создают потоки)
А что, если мне нужны отдельные потоки? (std:: async не может это сделать, насколько мне известно)