Моя игра использует многопоточную архитектуру, причем потоки выложены так:
На данный момент есть (hardware_threads — 3) рабочие потоки, по одному на каждый неиспользуемый аппаратный блок, но я хотел бы добавить еще один, объединив потоки «Ресурсы» и «Сеть» в один блок, так как оба потока будут тратить много времени на холостом ходу.
Вы правы в том, что это плохая идея. Создание одного потока для одной работы звучит просто, но на самом деле это не так, особенно когда некоторые работы тяжелее других. Кроме того, вы сделали не достаточно темы. Обычно вы хотите, чтобы пара больше, чем это, объясняла слабость в других потоках, которые сейчас не работают.
Основная проблема заключается в том, что вы реализуете свой собственный потоковый бэкэнд. Это плохая идея. Вам нужно перейти к чему-то вроде TBB, который будет заниматься всеми этими вещами для вас, а инженеры Intel потратили много времени, гораздо дольше профилируя и работая над этим, чем вы.
Что касается того, является ли это полезной оптимизацией, то, вероятно, нет. Просто наберите достаточное количество рабочих и держите их загруженными, и ресурсы / сетевые потоки, которые блокируют, не будут иметь большого значения.
Потоки отлично подходят для распределения работы и для избежания чего-то, ожидающего чего-то, что не имеет большого значения, если мы будем ждать прямо сейчас. Так что использование потоков — определенно хорошая идея для вашего дизайна.
Что касается того, сколько потоков вы должны иметь, и стоит ли иметь более или менее потоков? Это гораздо более сложный вопрос. Для потоков, интенсивно использующих процессор, в действительности нет никакого смысла иметь больше, чем ядер процессоров в системе, так как вы не будете выполнять больше работы, имея дополнительные потоки [могут все еще быть причины архитектуры программного обеспечения, чтобы иметь больше потоков, но это обычно потому что программное обеспечение становится слишком сложным, и, надеюсь, вы не получите это …]
Для вещей, которые ждут и, следовательно, не используют много ресурсов ЦП, число потоков больше «того, что облегчает обработку в коде» — очевидно, наличие тысяч, вероятно, плохая идея, но один, два или три не не будет иметь большого значения. У вас, очевидно, будет та же проблема с «как мне сообщить потоку, что делать дальше, и когда мне нужно ждать результата …» и т. Д. Свободный поток не «делает» много для системы производительность — она занимает небольшой объем стековой памяти и еще меньший объем данных управления потоками, но это настолько мало, что на самом деле не имеет значения, если у вас их нет.
Подводя итог, возможно, «много криков об очень маленькой шерсти», как сказал слепой, когда стриг свинью — иными словами, много работы, мало пользы.