Отлично распараллеливается и некоторые задачи сводятся к этим
Используйте
std::transform - map
std::copy_if / remove_if - filter
- Memory bund-width (пропускная способность памяти, на серверных процах может быть неверно)
- Caches (кэши проца)
- (Hyper-threading) execution units
- Power usage (проц считает -> нагревается)
- Sharing (если запустили на разных ядрах, то у каждых отдельных ядер фактически свой
mutex
на кэш, из-за чего обращение к переменной, которая в кэше другого ядра происходит по времени как обращение к просто памяти) - False sharing (как sharing, но когда обращение не к одному объекту, а к объектам в одной кэш линии (процессоры синхронизируют кэш линии))
Если все что вам нужно - это ждать, то может быть потоки не лучшее решение
Message loop
Все события помещаются в некую “очередь” и из нее в бесконечном цикле достаются события и выполняются (так работает большинство UI программ)
Coroutines
Он же fiber
Работает как потоки, но метается из одного “чувака” в другого (проще хранить состояние, при этом оно фактически ничего не параллелит)